转自:http://janwer.iteye.com/blog/150226

 首先,说说 JSP/Servlet 中的几个编码的作用
  在 JSP/Servlet 中主要有以下几种设置编码的方式:

    1. pageEncoding ="UTF-8"(JSP)
    2. contentType = "text/html;charset=UTF-8"(JSP)
    3. request.setCharacterEncoding("UTF-8")(JSP,Servlet)
    4. response.setCharacterEncoding("UTF-8")(JSP,Servlet)

  其中前两个只能用于JSP 中,而后两个可以用于 JSP 和 Servlet 中。
  1、pageEncoding="UTF-8" 的作用是设置 JSP 编译成 Servlet 时使用的编码
  众所周知,JSP 在服务器上是要先被编译成 Servlet 的。pageEncoding="UTF-8" 的作用就是告诉 JSP 编译器在将 JSP 文件编译成Servlet 时使用的编码。通常,在 JSP 内部定义的字符串(直接在 JSP 中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。例如,你的JSP 文件是以GBK 为编码保存的,而在JSP 中却指定pageEncoding="UTF-8" ,就会引起JSP 内部定义的字符串为乱码。
  另外,该参数还有一个功能,就是在JSP中不指定 contentType 参数,也不使用response.setCharacterEncoding 方法时,指定对服务器响应进行重新编码的编码。
  2、contentType="text/html;charset=UTF-8" 的作用是指定对服务器响应进行重新编码的编码
  在不使用 response.setCharacterEncoding 方法时,用该参数指定对服务器响应进行重新编码的编码。

  3、 request.setCharacterEncoding("UTF-8") 的作用是设置对“客户端请求”进行重新编码的编码。
  该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。
  4、 response.setCharacterEncoding("UTF-8") 的作用是指定对“服务器响应”进行重新编码的编码。
  服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。

  其次,要说一说浏览器是怎么样对接收和发送的数据进行编码的 

  response.setCharacterEncoding("UTF-8") 的作用是指定对服务器响应进行重新编码的编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在 JSP 中设置 response.setCharacterEncoding("UTF-8") 或者response.setCharacterEncoding ("GBK") ,浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正确设置了pageEncoding 参数等)。可以做个实验,在JSP 中设置response.setCharacterEncoding("UTF-8") ,在 IE 中显示该页面时,在 IE 的菜单中选择 " 查看 (V)"-->" 编码(D)" 中可以查看到是 " Unicode(UTF-8)" ,而在在 JSP 中设置response.setCharacterEncoding("GBK") ,在 IE 中显示该页面时,在 IE 的菜单中选择 " 查看(V)--> 编码(D)" 中可以查看到是" 简体中文(GB2312)" 。
  浏览器在发送数据时,对 URL 和参数会进行 URL 编码,对参数中的中文,浏览器也是使response.setCharacterEncoding 参数来进行 URL 编码的。以百度和 GOOGLE 为例,如果你在百度中搜索"汉字",百度会将其编码为"%BA%BA%D7%D6" 。而在 GOOGLE 中搜索"汉字",GOOGLE 会将其编码为 "%E6%B1%89%E5%AD%97" ,这是因为百度的response.setCharacterEncoding 参数为 GBK ,而 GOOGLE 的response.setCharacterEncoding 参数为 UTF-8 。
  浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,默认情况下均为 JSP 页面的 response.setCharacterEncoding 参数(或者 contentType 和 pageEncoding 参数),我们称其为浏览器编码。当然,在IE中可以修改浏览器编码(在IE的菜单中选择" 查看(V)--> 编码(D)" 中修改),但通常情况下,修改该参数会使原本正确的页面中出现乱码。一个有趣的例子是,在 IE 中浏览 GOOGLE 的主页时,将浏览器编码修改为"简体中文(GB2312)" ,此时,页面上的中文会变成乱码,不理它,在文本框中输入"汉字",提交,GOOGLE 会将其编码为"%BA%BA%D7%D6" ,可见,浏览器在对中文进行URL 编码时,使用的就是浏览器编码。

  弄清了浏览器是在接收和发送数据时,是如何对数据进行编码的了,再来看看服务器是在接收和发送数据时,是如何对数据进行编码的。
  对于发送数据,服务器按照response.setCharacterEncoding—>contentType—>pageEncoding 的优先顺序,对要发送的数据进行编码。
  对于接收数据,要分三种情况。一种是浏览器直接用URL提交的数据,另外两种是用表单的GET 和 POST 方式提交的数据。
  因为各种 WEB 服务器对这三种方式的处理也不相同,所以我们以 Tomcat5.0 为例。
  无论使用那种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行 URL 编码。
  对于表单中 POST 方式提交的数据,只要在接收数据的 JSP 中正确request.setCharacterEncoding 参数,即将对客户端请求进行重新编码的编码设置成浏览器编码,就可以保证得到的参数编码正确。有人可能会问,那如何得到浏览器编码呢?上面提过了,在默认请情况下,浏览器编码就是你在响应该请求的 JSP 页面中response.setCharacterEncoding 设置的值。所以对于 POST 表单提交的数据,在获得数据的 JSP 页面中 request.setCharacterEncoding 要和生成提交该表单的JSP页面的 response.setCharacterEncoding 设置成相同的值。
  对于 URL 提交的数据和表单中 GET 方式提交的数据,在接收数据的 JSP 中设置 request.setCharacterEncoding 参数是不行的,因为在 Tomcat5.0 中,默认情况下使用ISO-8859-1 对 URL 提交的数据和表单中 GET 方式提交的数据进行重新编码(解码),而不使用该参数对 URL 提交的数据和表单中 GET 方式提交的数据进行重新编码(解码)。要解决该问题,应该在 Tomcat 的配置文件的 Connector 标签中设置useBodyEncodingForURI 或者 URIEncoding 属性,其中 useBodyEncodingForURI 参数表示是否用 request.setCharacterEncoding 参数对 URL 提交的数据和表单中 GET 方式提交的数据进行重新编码,在默认情况下,该参数为 false (Tomcat4.0 中该参数默认为true );URIEncoding 参数指定对所有 GET 方式请求(包括 URL 提交的数据和表单中 GET 方式提交的数据)进行统一的重新编码(解码)的编码。URIEncoding 和 useBodyEncodingForURI 区别是,URIEncoding 是对所有 GET 方式的请求的数据进行统一的重新编码(解码),而 useBodyEncodingForURI 则是根据响应该请求的页面的request.setCharacterEncoding 参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于 URL 提交的数据和表单中 GET 方式提交的数据,可以修改 URIEncoding 参数为浏览器编码或者修改 useBodyEncodingForURI 为true ,并且在获得数据的 JSP 页面中 request.setCharacterEncoding 参数设置成浏览器编码。

  下面总结下,以 Tomcat5.0 为 WEB 服务器时,如何防止中文乱码

    1. 对于同一个应用,最好统一编码,推荐为 UTF-8 ,当然 GBK 也可以。
    2. 正确设置 JSP 的 pageEncoding 参数
    3. 在所有的 JSP/Servlet 中设置 contentType="text/html;charset=UTF-8" 或response.setCharacterEncoding("UTF-8") ,从而间接实现对浏览器编码的设置。
    4. 对于请求,可以使用过滤器或者在每个 JSP/Servlet 中设置request.setCharacterEncoding ("UTF-8") 。同时,要修改 Tomcat 的默认配置,推荐将 useBodyEncodingForURI 参数设置为 true ,也可以将 URIEncoding 参数设置为 UTF-8 (有可能影响其他应用,所以不推荐.)。

jsp/servlet编码原理的更多相关文章

  1. 软件架构设计学习总结(18):MVC三层架构在各框架(jsp+servlet + Struts1+ Struts2+ springMVC)中的特征

    1.基于web开发中最原始的jsp+Servlet   图形化理解jsp+servlet结构: 1.从结构上分析jsp+servlet图解原理: 在基于mvc设计模式下的最原始的jsp+Servlet ...

  2. JSP/Servlet的编码原理

    转自:http://janwer.iteye.com/blog/150226 首先,说说 JSP/Servlet 中的几个编码的作用 在 JSP/Servlet 中主要有以下几种设置编码的方式: pa ...

  3. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  4. JSP+JavaBean+Servlet工作原理实例…

    JSP+JavaBean+Servlet工作原理实例讲解 首先,JavaBean和Servlet虽都是Java程序,但是是完全不同的两个概念.引用mz3226960提出的MVC的概念,即M-model ...

  5. JSP/Servlet基础语法

    相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp ...

  6. JSP/Servlet 中的汉字编码问题

    JSP/Servlet 中的汉字编码问题 1.问题的起源 每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的 ASCII,中国的 GB2312 -80,日本的 JIS 等,作为该国家/区 ...

  7. 第二章.JSP/Servlet及相关技术详解

    JSP的4种基本语法: 1.JSP注释: <%-- JSP注释部分 --%> 2.JSP声明: <%! //声明一个整型变量 public int count; //声明一个方法 p ...

  8. JSP(工作原理,组成部分,指令标签,动作标签,隐式对象)

    目录 JSP JSP 什么是JSP JSP全名为Java Server Pages 中文名叫java服务器页面 它是在传统的网页HTML文件(.htm,.html)中插入Java程序段和JSP标记 后 ...

  9. jsp+servlet和ajex中遇到的问题

    软件杯的时候,我们的项目需要在手机端运行,由于本身的这个项目我们使用jsp+servlet做的一个项目,所以我们利用ajex,把eclipse作为后台运行tomcat8,,在hbuilder用weba ...

随机推荐

  1. 指令——touch

    一个完整的指令的标准格式: Linux通用的格式——#指令主体(空格) [选项](空格) [操作对象] 一个指令可以包含多个选项,操作对象也可以是多个. 指令:touch    作用:创建文件 语法: ...

  2. TP框架数据模型

    1.TP框架的数据模型需要建在Model文件夹下: 1.数据模型 与控制器相似,但是每个数据模型控制一张数据表. 2.数据模型可写可不写,如果不写 则沿用父类数据模型. 2.访问数据库: 1.更改数据 ...

  3. Delphi 10.4 最新消息

    官方发布了关于10.4的消息,译文如下: 做为我们的Delphi,C ++ Builder和RAD Studio的订阅客户,除了获得更新,升级和技术支持等主要好处外,我们还邀请订阅客户参加Beta计划 ...

  4. UVA - 12186 Another Crisis(工人的请愿书)(树形dp)

    题意:某公司有1个老板和n(n<=105)个员工组成树状结构,除了老板之外每个员工都有唯一的直属上司.老板的编号为0,员工编号为1~n.无下属的员工(叶子)打算签署一项请愿书递给老板,但不能跨级 ...

  5. MFC工程合并

    假使有两个工程,分别为工程A和工程B. 第一步:把A中.rc文件中的 两张图中间的对话框资源拷贝出来,粘贴到B工程中的.rc资源文件中,也是两张图中间 第二步:打开工程-----VIEW------R ...

  6. CSS - 导入Google Web 字体

    @import url('http://fonts.googleapis.com/css?family=Poppins:100,200,300,400,500,600,700,800,900'); b ...

  7. struts2模型驱动传值问题

    控制台错误提示: 2020-01-08 18:34:40,292 [http-nio-8080-exec-3] [org.apache.struts2.dispatcher.Dispatcher]-[ ...

  8. 使用maven构建项目的注意事项

    一.如果修改了pom.xml文件,就有点类似修改了项目的结构,在再次运行项目前,应该Mvaen >>Update project一下. 二.对于依赖一个系列的的包,如spring,我们应该 ...

  9. C 的printf函数

    头文件 #include <stdio.h> printf函数是最常用的格式化输出函数,原型为:int printf(char *format,......); printf函数会根据参数 ...

  10. LVS DR模式搭建、keepalived+LVS搭建介绍

    参考文献 http://blog.51cto.com/taoxie/2066993 疑问: 1.为什么要修改RealServer的返回arp响应和发送arp请求参数  echo "1&quo ...