`
zhangyi6678
  • 浏览: 76475 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JSP和Servlet中的几个编码的作用及原理

阅读更多
首先,说说JSP和Servlet中的几个编码的作用。

在JSP和Servlet中主要有以下几个地方可以设置编码,pageEncoding="UTF-8"、 contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF- 8")和response.setCharacterEncoding("UTF-8"),其中前两个只能用于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中的几个编码的作用及原理

    JSP在Servlet中的几个编码的作用及原理

    JSP在Servlet中的几个编码的作用及原理 .txt

    代码和理论相结合的说明在实际开发中的中文乱码问题,大家看看便知道了!!!

    java 的乱码教程

    首先,说说JSP/Servlet中的几个编码的作用。 在JSP/Servlet中主要有以下几个地方可以设置编码,pageEncoding="UTF-8"、 contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF- 8")和response...

    JSP 程序设计从入门到精通 PDF 教程

     1.1.3 JSP技术有以下几个显著的优点 9  1.1.4 JSP和其他类似或相关技术的一个简单比较 10  1.2 JSP环境安装配置 12  1.2.1Tomcat下JSP环境的配置 12  1.2.1建立自己的Jsp工作目录 13  1.3 JSP语法介绍 ...

    java-servlet-api.doc

    然而,一个映射可能是由一个URL和许多Servlet实例组成,例如:一个分布式的Servlet引擎可能运行在不止一个的服务器中,这样的话,每一个服务器中都可能有一个Servlet实例,以平衡进程的载入。作为一个Servlet的...

    Jsp字符传递编码解释

    Jsp字符传递编码解释,的几个知识点。包括getBytes()用法,以及编码错误原因

    JSP对浏览器发送来的数据进行重新编码的两种方式

    在JSP/Servlet中主要有以下几个地方可以设置编码,pageEncoding=”GB18030″,contentType=”text/html;charset=GB18030″、request.setCharacterEncoding(“GB18030”)和 response.setCharacterEncoding(“GB18030...

    jsp编程技巧集锦

    servlet之间及与jsp间的通讯 96.获取当前绝对路径 97.在servlet中操作cookie 98.使用servlet生成JPEG图象 99.在servlet中根据请求参数自动填充java对象 100.将jsp应用程序打war包 101.实现投票...

    基于JSP电子书城系统

    本项目采用mvc设计模式,后台使用java语言进行开发,前端页面使用jsp加js脚本语言进行开发,数据的储存使用mysql数据库进行储存,功能的设计分为几个模块:图书模块,用户模块,订单模块,购物车模块,分类模块;...

    java面试宝典

    96、Hibernate工作原理及为什么要用? 22 97、Hibernate是如何延迟加载? 22 98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101...

    千方百计笔试题大全

    96、Hibernate工作原理及为什么要用? 22 97、Hibernate是如何延迟加载? 22 98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101...

    超级有影响力霸气的Java面试题大全文档

    创建了几个String Object? 两个 31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?  SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个...

    java 面试题 总结

    创建了几个String Object? 两个 28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ ...

    JAVA面试题最全集

    9.Jsp和Servlet中的请求转发分别如何实现。 三、J2EE相关知识 1.介绍J2EE、J2SE、J2SE的区别。 2.J2EE是一种技术还是一种平台,他提供了那些技术。 3.什么是Application Server,它有什么功能和优点。 4.简单...

    Java面试宝典2010版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 17.介绍一下Hibernate的二级缓存 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, ...

    leetcode下载-java:Studychen编码生涯中的几个java项目

    目前一共有下面几个项目 ConnWinBySSH 基于 JSCH 实现Linux远程连接windows并执行一些命令 ExtendDatabase 提高效率工具工程,扩展 ASE 数据库的data空间和log空间(默认增加 40G data和 10G log)。 DBLogMonitor ...

    java基础题 很全面

    11. Servlet执行时一般实现哪几个方法? 17 12. Servlet和CGI的区别。 18 13. 如何现实servlet的单线程模式 18 14. servlet的配置 18 15. STRUTS的应用(如STRUTS架构) 18 16. MVC的各个部分都有那些技术来实现?如何...

    SpringMVCStudy:在SpringMVC中学习的一些记录,先学习jsp语法

    SpringMVCStudy在这个项目中,SpringMVC中学习的一些记录,先学习jsp语法项目启动后,默认浏览器输入访问:此外还有几个controller定义几个类访问。仅仅作为HelloWorld的demo使用,暂无后续学习内容的更新,只是用来...

Global site tag (gtag.js) - Google Analytics