转自: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. SQL语句中为什么要用 where 1=1

    where 1=1; 这个条件始终为True,在不定数量查询条件情况下,1=1可以很方便的规范语句,1=1 是永恒成立的,意思无条件的,也就是说在SQL语句中有没有这个1=1都可以. 如:web界面查 ...

  2. 怎么更改Rstudio中的默认目录

    方法一. 每次启动Rstudio之后,执行代码 setwd("F:/R/R_data") 默认目录就会修改为双引号内的位置路径. 方法二. 对Rstudio进行设置一次即可. ①点 ...

  3. 一百零八、SAP的OO-ALV之二,创建屏幕Screen

    一.在资源管理器,右键->创建屏幕 二.输入4位数字 三.输入屏幕的描述 四.在逻辑流里面PBO用于显示屏幕,PAI用于用户交互. 五.在元素清单里面,在屏幕中的所有元素都是在元素清单中的

  4. 001、MySQL查询服务器版本号和当前日期

    SELECT VERSION(), CURRENT_DATE; 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  5. Zookeeper 在 Kafka 中的作用

    https://www.jianshu.com/p/a036405f989c 待整理...

  6. ISO处理jq事件

    jq事件在IOS上,如果标签本身不具备某些功能,而我们通过document或者body绑定上去的话,有些事件是不起作用的,同时在IOS上jq事件也存在延迟. 事件不起作用 这里点击事件为例,在IOS中 ...

  7. Node.js 发送Email

    章节 Node.js 介绍 Node.js 入门 Node.js 模块 Node.js HTTP模块 Node.js 文件系统模块 Node.js URL模块 Node.js NPM Node.js ...

  8. 【剑指Offer】面试题05.替换空格

    题目 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20are ...

  9. P 1030 完美数列

    转跳点:

  10. mui 横屏 竖屏

    在项目中只有某个页面需要横屏 ,其他的都是竖屏展示的. 假设a页面横屏 ,返回之后竖屏 b页面 a+ 将其设置为横屏显示: b+ 将其设置为竖屏显示 但是进入a页面之后再返回b页面时 b页面也会称为横 ...