`
hdwangyi
  • 浏览: 181622 次
社区版块
存档分类
最新评论

再论Tomcat和STRUTS中的中文问题

    博客分类:
  • Java
阅读更多
   Tomcat中开发WEB程序的中文问题困扰了许多人,网上也有大量讨论解决的方法。本文也准备在此讨论一下这个问题。
  中文问题有两个方面:

(1)中文的显示问题

   JSP页面:
   这个问题只需要在JSP页面中设定如下指令就可以解决:
  
 
   <%@page pageEncoding="支持中文的编码"%>
   

   Servlet:
   在doGet或doPost方法中,利用以下语句(假设HttpServletResponse参数名为response):
  
   response.setContentType("text/html;charset=支持中文的编码");
   

   HTML:
   可以在<HEAD>标记中设定
 
  <HEAD>
  <meta http-equiv="Content-Type" content="text/html; charset=支持中文的编码">
  </HEAD> 
 


  对于支持中文编码的具体选择,很多文章推荐利用GBK,这个当然可以,不过,利用UTF-8要更好一些,因为现在Java类库中为了能够适应国际化的需要,许多字符都是采用UTF-8进行的编码,所以,推荐采用UTF-8。

   另外一点需要注意的是,在存储JSP或HTML文件时,一定要保证存储文件的编码格式要与声明的中文编码的格式相同,否则的话会由于文件的实际编码和声明的编码不一至产生乱码。大部分的专业开发工具,比如MyEclipse、Netbeans等等,都会按照文件中声明的编码格式自动存储文件,所以不会有什么问题。但是,如果利用一些简单的工具,比如Windows的记事本,它不会自动按照声明的格式存储文件。在大部分情况下,文件会按照Windows系统默认的编码格式进行存储,即GBK编码。如果声明了UTF-8,这时反而会出现乱码。不过,记事本也支持不同的文本存储编码,只是需要手工指定:使用"文件"->"另存为"菜单,在文件存储对话框最后的“编码”框中选择UTF-8就可以了。

(2)中文参数的接收和传递问题
 
  在WEB中除去要显示中文信息之外,中文信息的接受和传递也是必不可少的。在WEB程序中,用户输入的数据和程序交互的主要方式就是利用HTTP协议的GET方法或POST方法,而用户的数据往往是由浏览器传递给Tomcat,Tomcat再交给WEB程序来处理这些数据。

   鉴于这个过程,要保证正确的中文信息接受和传递,首先要保证浏览器中的传递过来的数据要正确,所以,在显示用户界面时,应该要保证在JSP或HTML中设定了正确的字符编码。其实,只要按照问题(1)中的设定,一般都不会有问题。

   接下来就是程序中接受中文,此时问题稍稍有些复杂,这是由于在Tomcat不同的版本中,处理GET协议和POST协议的有不同方式造成的。

  (A)Tomcat4.x
   对于Tomcat4.x版本,它采用相同的方式处理HTTP协议中的get和set方法,所以,要处理这个问题,只需要在WEB程序中接受request参数时,在取出参数之前,在JSP的页面或Servlet的doGet(或doPost)利用如下代码就可以解决中文参数的获取问题:
  
 //该语句一定要位于取出参数值之前!
 request.setCharacterEncoding("编码名");
 String param=request.getParameter("param");

至于编码名具体采取什么,应按照你的传入数据的JSP页面或HTML页面中的字符编码而定,如果设定的为GBK,则此处也应是GBK,如果是UTF-8,此处也应设为UTF-8。

   要想在Tomcat4.x中免掉这个在接受参数前都要进行编码设定的麻烦,可以写一个过滤器Servlet,在它的doFilter方法中的第一行加入request.setCharacterEncoding()这条设置语句,然后让该过滤器监控所有的URL请求,即可直接在WEB程序中接受来自于request中的中文参数。

   STRUTS程序:
   由于框架封装了对于request参数的获取,所以,要先于框架对request参数进行编码设定,此时使用过滤器是一个好的选择。

  (B)Tomcat5.x
  在Tomcat5.x中,它采用不同的方式处理GET和POST请求,这时,如果按照上述的设定request的setCharacterEncoding方法,就只能对采用POST方法提交的数据起作用,而对于GET方法,request.setCharacterEncoding则失去了作用。

  因此,在Tomcat5.x中,需要单独处理GET方法的请求。如果直接在Apache的网站上下载Tomcat,则其默认的GET参数请求的编码均为ISO-8859-1,所以,要解决这个GET方法的中文问题,就需要在接受GET方式传过来的request中的参数时,首先将该参数转变为ISO-8859-1方式的字节数组,在利用String类的String(字节数组,"编码名称")构造方法,将该参数转变为正确的编码,这里,String构造方法中的"编码名称",应按照传过来数据的JSP或HTML中的编码来设定,如为GBK,则也应设定为GBK,如为UTF-8,也应设定为UTF-8,具体的过程如下:(以UTF-8编码为例)
 
    //p1参数来源于一个编码为UTF-8的JSP页面或HTML页面中的表单元素
    String p1=request.getParameter("p1");
    //pc中存储了正确的中文字符串
    String pc=new String(p1.getBytes("ISO-8859-1"),"UTF-8");
  


  由此可见,处理在Tomcat5.x中的中文有些麻烦,能不能不单独处理GET请求,就象Tomcat4.x中那样,只要设定request就可以解决问题呢?
 
  答案就是修改Tomcat5.x中的config目录中的server.xml文件中的处理GET请求的URIEncoding参数,将该参数的值设置为支持中文的编码即可。在此,还是推荐采用UTF-8作为URIEncoding参数的值。具体的设置方法请参看我的另一篇文章:让Tomcat支持中文文件和目录

  这样,在设置完成后,只要保证存储用户数据表单所在的JSP或HTML设定了和URIEncoding参数一样的编码,就可直接从request参数中获取到GET方法传过来的正确正文信息,无需再次转码。

   按照这样的设定,就可以象Tomcat4.x,写一个过滤器来处理所有的POST请求,而GET就无需设定了。

   对于Tomcat5.x中的STRUTS程序,设定server.xml文件中URIEncoding参数,然后在WEB程序中添加处理request的编码的过滤器Servlet,是一种相当方便的处理中文的方法,因为此时就无需程序中采用特殊的步骤处理传入的中文参数了。

   总结一下:
  (1)推荐JSP和HTML的编码都设置为UTF-8;
  (2)对于Tomcat4.x,为WEB程序编写一个监控所有URL请求的过滤器Servlet,在doFilter方法中对request参数执行request.setCharacterEncoding("UTF-8");,则在WEB程序中将不受中文问题的困扰,无论你采用什么样的WEB框架。

  (3)对于Tomcat5.x,在上述步骤的基础上,只要修改安装目录中的config/server.xml,添加参数URIEncoding,将其设置为UTF-8。

  按照上面的设定之后,在JSP或Servlet中取GET或POST过来的数据只需要如下一行常规的代码就可以了:
 
    String p1=request.getParameter("p1");
  

  对于STRUTS,也可以直接使用它在Formbean中存储的表单数据了。
分享到:
评论
4 楼 galaxystar 2008-01-19  
server.xml
useBodyEncodingForURI="true"
这个参数扩展性更好,表示以页面的编码作为request默认编码.
3 楼 dwangel 2008-01-19  
gazhangting 写道
(3)对于Tomcat5.x,在上述步骤的基础上,只要修改安装目录中的config/server.xml,添加参数URIEncoding,将其设置为UTF-8。

你说只要这个地方设置与页面上统一,就可以了,我发现我把这个地方改成了,UTF-8能后页面上是gbk,也没有什么问题.这个地方,还是不理解.

URIEncoding影响的是tomcat如何解释get方式通过url传递的参数,post的是另外的。

显示跟接受时解码没关系.
2 楼 gazhangting 2008-01-18  
(3)对于Tomcat5.x,在上述步骤的基础上,只要修改安装目录中的config/server.xml,添加参数URIEncoding,将其设置为UTF-8。

你说只要这个地方设置与页面上统一,就可以了,我发现我把这个地方改成了,UTF-8能后页面上是gbk,也没有什么问题.这个地方,还是不理解.
1 楼 aaronfeng 2007-08-01  
total test

相关推荐

Global site tag (gtag.js) - Google Analytics