JSP页面编码问题研究

Motivition
曾经有一个网友问过我这样一个问题:
<%@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。所以在这个环节中应用服务器都可以很好的把握,不会带来编码问题。

时间: 2024-10-29 18:44:06

JSP页面编码问题研究的相关文章

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>

JSP页面出现乱码问题,急!!!!!

问题描述 JSP页面出现乱码问题,急!!!!! jsp页面输入中文,但在数据库中显示的是问号,数据库直接写入中文能够正常显示,建立数据库时已设置编码CHARACTER SET gb2312,在jsp页面中,开头设置成 <%@ page language="java" import="java.util.*" pageEncoding="gbk"%> <%@ taglib prefix="s" uri=&quo

linux下jsp报错问题-jsp页面在linux报错问题

问题描述 jsp页面在linux报错问题 HTTP Status 500 - javax.servlet.ServletException: File ""/jsp/base/header.jsp"" not found type Exception report message javax.servlet.ServletException: File ""/jsp/base/header.jsp"" not found de

java接收JSP页面的编码

问题描述 本人是新手,最近在弄JSP+JAVAbean+Mysql的数据转换问题:jsp页面设置为:<%@pagecontentType="text/html;charset=GBK"%><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/>MYsql数据库的编码格式是ISO8859_1现在Javabean从JSP接收数据时(setXX()方法)

eclipse、MyEclipse 中怎么设置JSP页面的默认编码

Window-->preferences-->Web,然后点击JSP Files,在右边的Encoding里面挑选你要的编码方式,比如有个utf-8,这样你再建立jsp页面的时候就不用改编码了     MyEclipse编码设置 我的Myeclipse安装后编码默认是GB18030,外面的人一般推荐用UTF-8.如果在导入项目后发现乱码现象,那是编码设置设置不对.           Window>>Preferences>>MyEclipse>>Files

get提交中文乱码-在jsp页面上表单提交(用get方法)为什么提交的中文在url中是以编码的形式出现的呢?

问题描述 在jsp页面上表单提交(用get方法)为什么提交的中文在url中是以编码的形式出现的呢? 用form表单提交http://localhost:8080/BookShop/BookServlet?bookname=%E7%BB%9F%E4%B8%80&author=%E5%8F%91&booknum=89&price=7但如果用a href超连接来提交http://localhost:8080/BookShop/BookServlet?bookname=编程思想&a

如何解决html网页编码导致jsp页面乱码

html页面中这段不起眼的代码<meta http-equiv="Content-Type" content="text/html; charset=GBK">,错把如果charset=GBK设置为charset=UTF-8的话,即使jsp页面做了中文乱码处理,还是会出现乱码 jsp中文转码如下: String name = new String(request.getParameter("uname").getBytes(    &

J2ME开发中如何从MIDlet中调用JSP页面

js|页面 首先,我将讨论一下HttpConnection接口,这个接口可以用来建立Http连接 HttpConnection 接口 Connected Limited Device Configuration(有限连接设备配置.简称CLDC).提供了一套用于网络连接的类,就是普通连接框架?一种平台独立连接框架,提供了一种分层的连接接口,它的实现操作系统由具体的设备简表提供(比如Mobile Information Device Profile(MIDP)). MIDP通过提供支持HTTP的Ht

如何从MIDlet中调用JSP页面

js|页面     首先,我将讨论一下HttpConnection接口,这个接口可以用来建立Http连接 HttpConnection 接口 Connected Limited Device Configuration(有限连接设备配置.简称CLDC).提供了一套用于网络连接的类,就是普通连接框架?一种平台独立连接框架,提供了一种分层的连接接口,它的实现操作系统由具体的设备简表提供(比如Mobile Information Device Profile(MIDP)). MIDP通过提供支持HTT