`
Dustin
  • 浏览: 314343 次
  • 性别: Icon_minigender_1
  • 来自: 广州/成都
社区版块
存档分类
最新评论

深入浅出java中文问题(四)Web应用中的中文问题

阅读更多
    Web应用中出现的中文问题可能是最常见的,也是网络上讨论得最多的java中文问题了,而这跟JSP(Servlet)技术在Web中的广泛应用有着紧密的联系。Web应用运行在一个分布式的环境中,服务端和客户端通过HTTP协议连接在一起,而数据交换的双方分别是Web容器和浏览器。这就是一个典型的B/S结构的分布式应用。Web容器的存在是Web应用跟一般的控制台程序最大的不同之处。在一般的控制台程序中,数据是直接交付给程序员进行处理的,这样程序员对数据格式的控制有很大的自由度,也比较直观。但是在Web应用中,来自客户端的数据是先交付给Web容器,Web容器处理过后再交给程序员的;输出时也同样要经过Web容器进行中转。在这个中转过程中,Web容器帮我们完成了很多基础而且繁琐的工作,但是也在一定程度上减弱了我们对数据控制的自由度。此时,我们只能通过配置Web容器或者在JSP(Servlet)文件中指定的方式来管理数据的编码方式。如果没有处理好这些配置,那么就会出现中文问题了。
      解决Web应用中的中文问题,我们同样需要了解Web应用的运行过程,搞清楚哪个步骤会导致中文问题的出现,这才能有的放矢,一击即中。现在,用得比较多的Web容器是tomcat,而 tomcat的默认编码方式是ISO-8859-1,而不是系统的默认编码方式。很多的中文问题就是因为这个原因产生的。下面的描述都是基于tomcat环境的。
      Servlet的编写和保存方式跟普通的.java源文件是一致的,当客户端请求该Servlet时,Web容器将相应的.class文件调入虚拟机中,运行,得到结果。
      JSP是一种特殊的Servlet,当客户端请求某个JSP文件时,WEB容器调用JSP编译器,JSP编译器先查看JSP文件中是否设置有文件编码格式(使用pageEncoding 属性进行设置),如果JSP文件中没有设置JSP文件的编码格式,则JSP编译器调用JDK先把JSP文件用JVM默认的字符编码格式(也即WEB容器所在的操作系统的默认的file.encoding)转化为临时的Servlet类,然后再把它编译成UNICODE格式的class类,并保存在临时文件夹中。从这以后,JSP的运作方式就跟Servlet保持一致了。
     值得注意的是,在部署的过程中,对于Servlet我们只需要编译过后的.class文件,但是对于JSP,我们却需要它的源文件,而这些源文件是在运行过程中由Web容器动态编译成.class文件的,因此我们必须通知Web容器我们的JSP文件是用什么编码方式保存的(使用指令 pageEncoding),而且我们JSP文件的实际保存方式必须与此相同。(一般的IDE都会自动实现这个功能,保证pageEncoding属性的值跟JSP文件的实际保存格式的一致性。但是如果你是用记事本等工具来编写的话就要自己注意了,很可能会出现pageEncoding="UTF-8",但是却按系统默认编码方式保存为GBK的,这样中文问题又来了)。
     在Servlet的运作过程中,会收到来自客户端的数据或者向客户端输出数据,如果在这个过程中没有指定request和response的编码方式,Servlet会默认使用ISO-8859-1,而不是系统默认的编码方式。因此,如果输入或者输出的数据含有中文字符,但是程序中却没有指明编码方式,那么Web容器就会用ISO8859-1进行处理,这样就会出现中文问题了。
     基于上述分析,我们在编写Web应用的时候可以进行以下处理,以防止中文问题的出现。
      1、对于Servlet,我们在doGet和doPost方法中设置好输入和输出的编码方式。 
  1. //设置输入编码格式   
  2.  request.setCharacterEncoding("UTF-8");   
  3. //设置输出编码格式   
  4.  response.setContentType("text/html;charset=UTF-8");  

         
    2、在每个JSP文件中加入以下指令和语句,确保JSP文件的编码方式在不同的平台中都能够正确识别,同时正确处理相应的输入和输出。

  1. <%@page pageEncoding="UTF-8"%>//设置页面编码格式   
  2. <%@page contentType="text/html;charset=UTF-8"%>//设置输出编码格式   
  3. <%request.setCharacterEncoding("UTF-8");%>//设置输入时编码格式  

    3、如果你嫌每个文件都这么携麻烦的话,用Filter吧。只在doFilter方法中设定好输入输出的编码方式就可以了。但是提醒一下,在这里设定ContentType对Servlet可以起作用,但是对于JSP是没有效果的,因为JSP页面已经隐含调用了getWriter方法,setContentType方法已经不起作用了。对于JSP,还是只有在页面上指定ContentType。

    本来,经过上述几个步骤以后,关于JSP(Servlet)的中文问题也就解决了,但是如果你使用的Web容器是tomcat,并且版本在5.0以上,那么新问题又出来了:在处理输入数据过程中,tomcat在处理GET方法和POST方法时方式是不相同的。对于POST方法,经过上面的设置后,tomcat就十分顺从地按照设置的方式处理输入输出数据了。但是对于GET方法,tomcat却显得有点不可理喻,它根本不管我们在程序中request.setCharacterEncoding(encoding)的设置,而是一意孤行,使用ISO-8859-1进行解码,中文问题又出来了。
    怎么办呢?不用怕,人民的力量是伟大的。首先,我们要清楚提交给GET方法处理的数据是浏览器按照URL参数的形式传递过去的。哪些数据会使用这种方式进行传递呢?
   第一种,是程序员显示地将参数附加到连接的URL中,用以传递数据。如在JSP页面中有以下语句:

  1. <%   
  2.     String str = "数据";   
  3. %>  
  4. <a href="view.jsp?data=<%=str%>">点击传递数据</a>  

    在这种情况下,数据传递过去一定是乱码来的。我们必须先将数据进行URL编码,然后再附加再URL后面进行传递。Java中提供了URL编码相关编码和解码的类。如下:

  1. <%   
  2.     String data"数据";   
  3.     String encodedStr = java.net.URLEncoder.encode(data,"utf-8");   
  4. %>  
  5. <a href="view.jsp?data=<!---->">点击传递数据a>  

    第二种情况,是表单使用属性method设定为GET,这样,浏览器会按照当前页面的编码方式自动将表单中的数据编码成URL编码,然后通过URL参数的形式进行传递。
    现在,数据是传递过去了,tomcat也收到了,它将怎么处理呢?
    1、如果按照默认设置的话,它将按照ISO-8859-1进行解码。如果在数据接收jsp页面或者Servlet中直接使用的话,肯定是要出现乱码了。要解决这个问题,我们在接收处可以这样处理:

   2、如果我们不想这么麻烦,每次都重新解码的话,我们可以通知tomcat一声。方法如下:打开tomcat的server.xml文件,在上面添上一句:  

  1. debug="0"  
  2. acceptCount="100"  
  3. connectionTimeout="20000"  
  4. disableUploadTimeout="true"  
  5. port="80"  
  6. redirectPort="8443"  
  7. enableLookups="false"  
  8. minSpareThreads="25"  
  9. maxSpareThreads="75"  
  10. maxThreads="150"  
  11. maxPostSize="0"  
  12. URIEncoding="UTF-8"  

     这样,tomcat就会自动按照UTF-8解码URL传递过来的数据,还中文的“真我本色”。但是这样的话,我们必须URL传递的数据都是使用UTF-8来编码的。
   

    通过上面设置,java中文问题应该可以在web应用中退出江湖了。当然,Web应用一个很重要的组成部分是数据库,这里同样会出现中文问题,这部分内容将在后续的文章中描述。

分享到:
评论

相关推荐

    深入浅出java服务

    ### 深入浅出Java服务:以Dubbo为例 #### 一、Java服务的演进与发展背景 Java作为一门广泛使用的编程语言,其服务端技术的发展经历了从简单的客户端/服务器(C/S)模式到浏览器/服务器(B/S)模式的转变,并伴随着一...

    深入浅出java程序语言设计.pdf

    从提供的信息来看,这份资料似乎是一本关于Java编程语言的深度教程——《深入浅出Java程序语言设计》的完整版PDF。尽管没有直接提供书籍的内容,但从标题、描述及标签中,我们可以推断出该书可能涵盖的一些核心知识...

    深入浅出Java2面向对象程序设计习题答案

    【深入浅出Java2面向对象程序设计习题答案】是一本面向初学者的Java编程入门书籍,主要关注Java的面向对象特性。书中提供了习题解答,特别提到了单数题目的答案,帮助读者巩固学习。资源中包含了序号为奇数的习题...

    深入浅出学spring

    《深入浅出学Spring》这一教学视频为Spring框架的学习提供了详尽且易懂的指导,尤其适合初学者。Spring框架是Java平台上的一个开源框架,它提供了一种全面的基础架构支持,让Java开发者能够开发出更为简洁、高效的...

    深入分析java ++web技术内幕 修订完全版

    首先,书中深入浅出地介绍了Java编程语言的基础,包括语法、面向对象编程、异常处理和集合框架等核心概念。这为初学者提供了坚实的编程基础,也为有经验的开发者提供了回顾和巩固知识的机会。对于Java特性的理解,...

    HeadFirst系列之:深入浅出Rails(中文版)高清完整PDF

    《深入浅出Rails》将使你的编程和生产力达到最大值。你将学习一切Rails scaffolding的基本原理,以创建自定义的交互式网络应用程序,全部使用Rails的一套丰富的工具和MVC框架。 你将掌握数据库交互、Ajax和XML的集成...

    深入浅出学Spring_Web_MVC

    ### 深入浅出学Spring Web MVC #### 一、Spring Web MVC 概述 **Spring Web MVC** 是一种轻量级的、基于MVC(Model-View-Controller)设计模式的Web应用框架,是Spring框架的重要组成部分之一。它为开发者提供了...

    深入浅出Struts2源码(1-5章).rar

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。书中...

    深入浅出Rails(中文版)

    《深入浅出Rails(影印版)》内容简介:通过此书,你将学习:希望你的网络应用超越平庸进入Web 2.0时代?《深入浅出Rails》将使你的编程和生产力达到最大值。你将学习一切Rails scaffolding的基本原理,以创建自定义的...

    深入体验Java Web开发内幕

    使您由内而外地明白使用Java进行Web应用开发的全过程——从XML基础知识到HTTP详述及相关体验,从用Tomcat配置Web站点到HttpServletResponse和HttpServletRequest的应用,以及JSP、JavaBean等Java Web开发相关方面都...

    深入浅出Struts2.pdf

    本资料“深入浅出Struts2”是InfoQ中文站出品的优秀入门教程,旨在帮助初学者快速理解并掌握Struts2的核心概念和技术。 **一、Struts2架构与核心组件** 1. **FilterDispatcher**: Struts2框架的入口点,作为...

    深入浅出Tapestry高清

    《深入浅出Tapestry高清版》在介绍内容的安排上,充分考虑到Tapestry对主流Java应用的支持功能,介绍了对Spring、Hibernate、Ajax等技术的融合,使得Tapestry可以用于开发非常热门的Web应用。此外,本书还介绍了作者...

    spring-boot深入浅出

    《Spring-Boot深入浅出》是一本专注于Spring Boot框架的深度解析书籍,旨在帮助开发者全面理解和熟练运用这一现代Java开发的利器。Spring Boot以其“起步依赖”、“内嵌服务器”和“自动配置”等特性,极大地简化了...

    深入浅出Java语言程序设计

    通过“深入浅出Java语言程序设计”这个教程,你将不仅掌握Java语言的核心概念,还能了解其在实际开发中的应用,从而成为一名合格的Java开发者。无论是为了就业还是自我提升,这都是一个不可多得的学习资源。

    深入浅出Android软件开发教程.pdf+源码

    本书理论与实践相结合,内容详尽,配有丰富的示例程序,讲解深入浅出,可以使读者在较短的时间内理解Android系统框架及其应用的开发过程,掌握Android应用程序的设计方法。 本书提供所有程序的源代码和电子课件。...

Global site tag (gtag.js) - Google Analytics