`

JSP页面编码问题研究

    博客分类:
  • JSP
阅读更多
曾经有一个网友问过我这样一个问题:
<%@page contentType="text/html; charset=UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
中国
</body>
</html>

这个页面在为什么在运行的时候“中国”会变成乱码?

Analysis
Key Step

对于上面问题的分析需要从整个JSP页面请求的生命周期来看,一般的都需要经历下面几个阶段:

1。应用服务器根据JSP页面生成一个Java文件

2。应用服务器调用java.exe将Java文件编译成一个Servlet对应的class文件

3。用户的浏览器请求JSP对应的Servlet,Web容器起一个线程执行Servlet,将数据返回给客户端浏览器

4。用户的IE根据返回的数据,将结果显示给用户。

Key Step Analysis
为了更好的了解编码问题,我们暂时先从上面的四个环节一步步来分析,根据分析的结果,来得到最终的解决办法。

1. 在应用服务器根据JSP页面生成Java文件阶段。

应用服务器会将整个JSP页面的代码读取出来,然后写到一个新的JAVA文件中,在读文件和写文件的时候都牵涉到一个编码问题,这个编码问题应用服务器是如何解决的呢?我研究Tomcat应用服务器的源代码,发现Tomcat中有一个pageEncoding参数非常重要,在 ParserController会从JSP文件中读出这个参数(如果没有读到,就从第一行的contentType中读取charset),然后保存起来,如果没有读取到这个参数,会从JspConfig中读出一个默认的PageEncoding参数,如果这两个参数都没有的设置,系统会默认成 ISO8859-1的编码来读取原来的JSP文件。

从上面的分析出,我们已经基本了解了应用服务器读取JSP文件的编码方式,由于Java底层都是基于Unicode编码来存储字符的,所以在写文件的时候,都输出成Unicode编码的形式。

2。在JDK将Java文件编译成Class文件的时候

可以利用-encoding参数指定源文件的编码,这在手动编译的时候非常重要,因为这决定了Java虚拟机读取Java文件时采用的编码方式,但是在 Web应用中这个环节我们可以忽略,因为应用服务器可以很好的解决这个编码。以Tomcat为例,由于生成的java文件是固定的UTF-8编码,所以 Tomcat也固定的采用UTF-8编码来读取,通过浏览AbstractCatalinaTask可以看到reader = new InputStreamReader(hconn.getInputStream(), CHARSET);其中的CHARSET=utf-8。所以在这个环节中应用服务器都可以很好的把握,不会带来编码问题。

3. 用户的浏览器请求JSP对应的Servlet阶段。

如果前面的环节中不会带来编码问题,也就是说在Java虚拟机中运行的时候,能正常的获取到“中国”,那么在执行servlet的环节中“中国”始终是以Unicode存储的中国,那么在第三个环节中需要关注的是JspWriter如何将数据返回给客户端浏览器。大家可以试验一下,在java中如果用 new String(str.getBytes("encoding"),"encoding")执行的时候,始终不会出现乱码问题,也就是说,一个字符串可以用不同的代码来getBytes()生成字节数组(底层I18N.jar所作的工作,提供Byte2Char和Char2Byte的转换)。

如果大家可以理解这一点,那么下面大家就需要了解JspWriter输出字符串时采用的编码方式是什么?通过浏览Response.java类可以了解到 Tomcat应用服务器是根据contentType来获取的writer的编码方式,也就是说,最后返回客户端的字节流是contentType对应的 charset中获取出来的字节数组。

4. IE根据返回的数据处理显示阶段

通过前面的分析可以了解到,应用服务器返回的“中国”是根据ContentType中的charset来显示的,只要IE知道该用这个编码来接收字节流并转成字符串,并将用户的浏览器推荐合适的编码来查看结果,用户就可以浏览到正确的“中国”两个字。可以高兴得是,目前的IE等浏览器正式这样处理的。

Conclusion
通过上面的分析,我们可以看到,在整个JSP页面的编码过程中,我们真正要解决的是JSP文件到Java文件这个过程中的编码问题,也就是 PageEncoding参数的设置问题。由于pageEncoding参数是servlet2.3规范中规定的参数,所以下面的方法在很多应用服务器下面都通用,这方面的设置本人在工作中基本上得到了下面的一些方法:

1。在JSP页面的中加上pageEncoding参数,比如:<%@ page contentType="text/html; charset=UTF-8" pageEncoding="GBK"%>,这样就可以将页面可以用ANSI来存储。也就是说当页面存储的编码方式和contentType中的 charset不一样的时候,可以考虑加上pageEncoding参数。

2。有些应用服务器(如weblogic),在没有获取到pageEncoding参数的时候,不是先从charset中获取编码类型,而是从另外的一些配置文件,如weblogic.xml文件中加上下面的代码:
<jsp-descriptor>
<jsp-param>
<param-name>compilerSupports</param-name>
<param-value>true</param-value>
</jsp-param>
<jsp-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</jsp-param>
</jsp-descriptor>

(在Tomcat5X种也有类似的处理,在应用的web.xml文件中加上类似下面的配置项)
</jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>

以上是对JSP页面编码的一些分析和处理方法,希望能对大家今后的学习和工作中有帮助!

原文网址:http://www.99inf.net/SoftwareDev/Java/29556.htm
分享到:
评论

相关推荐

    WEB页面乱码研究问题

    jsp中Web页汉字乱码问题研究,PDF格式电子书

    html转jsp工具

    1、此工具只针对utf-8和gb2312两种编码格式的网页进行转换,其他编码格式的网页不支持转换! 2、此工具会自动在html页面的开始位置加入以下内容,并自动将html或者htm页面转为jsp后缀的文件 *" pageEncoding="utf-8...

    Java Web应用开发中的中文乱码问题研究.pdf

    在java Web应用开发中,软件开发人员最容易遇到的问题就是中文的乱码问题,其中最常见的有两种,JSP页面中文显示乱码和表单提交参数中文乱码。本文通过深入分析这两种中文乱码问题产生的原因,分别给出了对应的解决方案...

    JSP基于BS结构下的邮件系统设计开发(源代码+论文).rar

    前端可能涉及HTML、CSS和JavaScript技术,用于创建用户友好的界面,而后端则由JSP页面和可能的JavaBean组件组成,负责处理邮件发送、接收、存储和管理等功能。此外,包含的研究论文可能会详细阐述系统的设计原理、...

    基于JSP的网上书店的一种设计与实现

    以JSP程序设计与编码为重点,从动态网上书店的系统概述、网站的页面组成、系统功能模块分析、数据库及程序设计与实现等方面,探讨了如何运用JSP技术开发基于Web的网上书店。

    基于JSP技术的银行管理系统的毕业设计与实现.doc

    本系统采用JSP+J avaBean的开发模式进行开发,采用ACCESS为后台数据库,以JSP Web为页面形式,涉及到数据库、网络、Web服务器等方面的技术,实现了较为完备的功 能。包括公共信息管理:权限用户管理、机构管理、部门...

    Java毕业设计-基于ssm框架开发的助学贷款+jsp-毕业论文(附源代码).rar

    该项目以助学贷款系统为开发背景,结合了JSP页面展示技术,不仅具有实际应用价值,也满足了毕业设计的学术要求。 项目源代码清晰规范,逻辑结构层次分明,便于学习和理解。通过该项目,开发者可以学习到SSM框架的...

    jsp621ssh_Mysql会员消费系统.java源码论文

    5.编码:开始编写程序代码,主要是实现功能,根据详细设计确定每个页面。 6.制作页面:根据功能,使用DIV+CSS进行页面布局,初步实现整个系统。 7.测试和优化应用程序:自己把流程过一遍,确保程序正常运行,也可以...

    java web 视频、电子书、源码(李兴华老师出版)

    6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 ...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 ...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 ...

    李兴华Java Web开发实战经典(高清版) Part2

    6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面...

    java面试题以及技巧

    │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt).rar │ │ │ └─javascript资料(源码,教材,ppt) │ 00s.jpg │ 10...

    java面试题目与技巧1

    │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt).rar │ │ │ └─javascript资料(源码,教材,ppt) │ 00s.jpg │ 10...

    java面试题及技巧4

    │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt).rar │ │ │ └─javascript资料(源码,教材,ppt) │ 00s.jpg │ 10...

Global site tag (gtag.js) - Google Analytics