`
sqe_james
  • 浏览: 264866 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JSP/Servlet的编码原理

    博客分类:
  • J2EE
阅读更多

首先,说说 JSP/Servlet 中的几个编码的作用

JSP/Servlet 中主要有以下几种设置编码的方式:

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

其中前两个只能用于JSP 中,而后两个可以用于 JSPServlet 中。

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 ,而 GOOGLEresponse.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提交的数据,另外两种是用表单的GETPOST 方式提交的数据。

因为各种 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-1URL 提交的数据和表单中 GET 方式提交的数据进行重新编码(解码),而不使用该参数对 URL 提交的数据和表单中 GET 方式提交的数据进行重新编码(解码)。要解决该问题,应该在 Tomcat 的配置文件的 Connector 标签中设置useBodyEncodingForURI 或者 URIEncoding 属性,其中 useBodyEncodingForURI 参数表示是否用 request.setCharacterEncoding 参数对 URL 提交的数据和表单中 GET 方式提交的数据进行重新编码,在默认情况下,该参数为 falseTomcat4.0 中该参数默认为true );URIEncoding 参数指定对所有 GET 方式请求(包括 URL 提交的数据和表单中 GET 方式提交的数据)进行统一的重新编码(解码)的编码。URIEncodinguseBodyEncodingForURI 区别是,URIEncoding 是对所有 GET 方式的请求的数据进行统一的重新编码(解码),而 useBodyEncodingForURI 则是根据响应该请求的页面的request.setCharacterEncoding 参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于 URL 提交的数据和表单中 GET 方式提交的数据,可以修改 URIEncoding 参数为浏览器编码或者修改 useBodyEncodingForURItrue ,并且在获得数据的 JSP 页面中 request.setCharacterEncoding 参数设置成浏览器编码。

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

  1. 对于同一个应用,最好统一编码,推荐为 UTF-8 ,当然 GBK 也可以。
  2. 正确设置 JSPpageEncoding 参数
  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 要注重理论与实践相结合,不仅要理解它们的工作原理,还要通过编写实际项目来提升技能。同时,不断关注新技术,如 Spring Boot 和微服务架构,这将有助于你更好地适应 Java Web 开发的未来趋势...

    使用JSP/Servlet技术开发新闻发布系统.zip

    【PPT课件】:这些课件会详细介绍JSP和Servlet的基础知识,包括它们的工作原理、生命周期、API使用等,同时也会讲解如何在实际项目中整合这两个技术。 【上机实践】:这部分内容让学员有机会动手实践,通过编写代码...

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

    本文将深入探讨JSP和Servlet中的几个关键编码设置的作用及原理,帮助开发者更好地理解和解决实际开发中遇到的编码问题。 #### 二、主要编码设置及其作用 ##### 1. `pageEncoding="UTF-8"` - **作用**:`...

    JSP+SERVLET教程

    综上所述,通过学习JSP和Servlet,我们可以构建出高效、安全且可扩展性强的Web应用程序。这些技术不仅是Java Web开发的基础,也是现代Web应用的重要组成部分。掌握这些知识点对于开发者来说至关重要。

    jsp/servlet中过滤器和监听器的区别

    在Java Web开发中,JSP(JavaServer Pages)和Servlet是两种重要的技术,它们用于构建动态Web应用程序。在这些技术中,过滤器(Filter)和监听器(Listener)是两个关键的概念,它们在处理请求、响应以及管理应用...

    JSP_Servlet 中的汉字编码问题.pdf

    通过对字符集、编码原理的理解以及采取适当的解决方案,可以有效地避免乱码问题的发生。对于开发人员而言,掌握正确的编码知识是非常重要的,尤其是在开发面向全球用户的多语言应用时更是如此。

    JSP Servlet学习资料--全套PPT

    **JSP(JavaServer Pages)和Servlet是Java Web开发中的两个...**通过这套“JSP Servlet学习资料--全套PPT”,你将能够深入理解这两个技术的原理和应用,掌握它们的实战技能,为你的Java Web开发之路打下坚实基础。**

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

    标题 "JSP在Servlet中的几个编码的作用及原理" 指向的是Java Server Pages (JSP) 和 Servlet 技术中关于字符编码的关键概念。在Web开发中,尤其是在处理多语言用户输入时,正确的编码处理至关重要,以避免乱码问题。...

    servlet 编码

    Servlet编码是Java Web开发中的重要一环,它主要用于构建动态Web应用程序。Servlet是一个Java类,遵循Servlet API规范,由Web服务器加载并执行以响应客户端(通常是浏览器)的请求。在这个教案中,我们将深入探讨...

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

    ### JSP与Servlet中的编码处理及其原理 #### 标题:JSP在Servlet中的几个编码的作用及原理 #### 描述:本文将通过代码与理论相结合的方式深入探讨在实际开发过程中遇到的中文乱码问题。 #### 标签:j2ee jsp ...

    自学jsp+servlet读书心得

    通过实际编写JSP和Servlet项目,可以深入理解它们的工作原理和交互方式。描述中提到有源码可供参考,这是一份宝贵的资源,可以用来验证理论知识,解决实际问题,提升编程技能。在测试源码时,注意理解每一部分代码的...

    programming-Dictionary.zip_Jsp/Servlet_Java_

    通过这个项目,开发者将深入理解JSP和Servlet的工作原理,掌握Web开发的基本流程,同时提升数据库操作、用户认证和权限管理等方面的能力。此外,项目实战还能提升问题解决能力,为将来参与更复杂的项目打下坚实基础...

    jsp+servlet实现图片上传

    在本文中,我们将深入探讨如何使用Java的JSP(JavaServer Pages)和Servlet技术来实现一个图片上传功能。这是一个常见的Web开发任务,特别是在构建交互性强、动态内容丰富的网站时。以下是一些关键知识点: 1. **...

    JSP与Servlet程序设计实践教程.pdf

    #### 二、JSP与Servlet的基本原理 - **JSP生命周期**: 包括创建、初始化、服务、销毁等阶段。每个阶段都有相应的事件触发器,例如初始化时会调用`init()`方法,服务时会调用`service()`方法。 - **Servlet生命周期*...

    JSPServlet 中 字符编码问题

    其实 JSP/Servlet 的中文encoding 并没有想像的那么复杂,虽然定位和解决问题没有定规,各种运行环境也各不尽然,但后面的原理是一样的。了解字符集的知识是解决字符问题的基础。不过,随着中文字符集的变化,不仅仅...

    酒店订单管理系统(Jsp+servlet+mysql).zip

    本文将深入探讨一个以Jsp、Servlet和MySQL为核心技术构建的酒店订单管理系统,帮助读者理解其架构、功能以及实现原理。 1. **系统架构** 该酒店订单管理系统采用典型的B/S(Browser/Server)架构,用户通过浏览器...

    jsp结合servlet实现文件上传

    在Java Web开发中,JSP(JavaServer Pages)和Servlet是两种常见的技术,它们常常结合使用来处理用户交互和服务器端逻辑。本知识点主要聚焦于如何利用JSP和Servlet实现文件上传功能,这是一个在Web应用中非常实用的...

    jsp,servlet普通表单+文件上传

    在Java Web开发中,`jsp`(JavaServer Pages)和`servlet`是常见的技术,用于构建动态网页。本示例中的“jsp,servlet普通表单+文件上传”着重讲解如何结合这两种技术实现一个包含普通输入字段和文件上传功能的表单...

    JSP Servlet 学习笔记源码

    通过学习和实践这些知识点,开发者不仅能掌握JSP Servlet的基本用法,还能深入理解Web开发的原理,为构建高效、可扩展的Web应用打下坚实基础。这份"JSP Servlet 学习笔记源码"将提供丰富的实例和练习,帮助你更好地...

Global site tag (gtag.js) - Google Analytics