欢迎光临
我们一直在努力

JSP页面编码问题研究-JSP教程,Jsp/Servlet

建站超值云服务器,限时71元/月

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。所以在这个环节中应用服务器都可以很好的把握,不会带来编码问题。

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来存储。也就是说当页面存储的编码方式和chtenttype中的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页面编码的一些分析和处理方法,希望能对大家今后的学习和工作中有帮助!

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » JSP页面编码问题研究-JSP教程,Jsp/Servlet
分享到: 更多 (0)