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

再论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

相关推荐

    jsp_毕业设计参考文献

    涵盖数据库访问技术、Java Web 开发技术、Struts 框架、JavaScript 脚本程序设计、SQL Server 索引选取、Tomcat 与 Java Web 开发技术、计算机技术与应用研究、JSP 中文问题解决方案、数据库系统概论、电子政务研究...

    基于J2EE短信共享网站设计(Spring+Struts2+Hibernate)

    编码问题,导致中文字符写不到数据库中,需要修改Mysql文件夹下 my.ini 文件,默认字符集修改(二处)为utf8 2.初始不了SessionFactory 可能是二级缓存初始化问题,去掉二级缓存即可(在hibernate.配置文件中)(没...

    有关java,jsp类论文可用的英文论文及中文译文

    例如,它们可能分析如何利用Servlet容器(如Tomcat)来提高JSP应用的性能,或者讨论如何避免常见的安全问题,如SQL注入和跨站脚本攻击。同时,论文可能还会涵盖最佳实践,如如何有效地组织代码结构,以及如何使用MVC...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    毕业设计任务书

    (2)开发工具和所用技术的介绍:在毕业设计论文中,学生需要对所使用的开发工具和技术进行介绍,如MyEclipse、Tomcat、PowerDesigner等,以便让读者了解设计的技术架构。 (3)系统分析:在毕业设计论文中,学生...

    基于JSP企业车辆管理系统设计软件程序源码+数据库+WORD毕业设计论文文档.zip

    此次设计主要采用MyEclipse加Tomcat后台服务器进行,设计过程中页面主要使用JSP技术完成,下面对MyEclipse、Tomcat和MySQL数据库进行简要介绍。 1.3.1.1 MyEclipse MyEclipse,是一个十分优秀的用于开发Java, J2EE的...

    客户管理系统开题报告

    描述中提到该系统将采用MVC设计模式,结合Struts和Hibernate框架技术,通过网络实现对客户的全面管理,包括信息管理、反馈信息收集和查询功能。 在这一开题报告中,主要知识点包括: 1. **MVC设计模式**:Model-...

    任务书weixin154阳光电脑公司的维修服务微信小程序+ssm开题+任务书.doc

    * Java Web 中中文乱码问题的探讨:Java Web 开发中常见的中文乱码问题的解决方案。 微信小程序设计 微信小程序的设计主要涉及到以下几个方面: * 用户前端:使用微信开发者工具开发用户前端,主要涉及到用户界面...

    个人博客系统源码下载

    论模块、登录模块、后台管理模块,以下是各个模块的功能介绍: 序号 模块名称 主要功能 1 首页模块 显示博客的 LOGO 信息和主菜单,包括首页的链接, 登录(已登录用户显示后台管理和退出) 分页页显示 Java 分类下...

    计算机专业经典书籍推荐.pdf

    Effective Java 中文版是Joshua Bloch所著,介绍了Java开发中的一些最佳实践和常见错误,帮助开发者编写高质量的Java代码。精通 Struts:基于 MVC 的 Java Web设计与开发是孙卫琴所著,介绍了Struts框架的设计和...

    计算机专业经典书籍推荐

    孙卫琴的几本书则专注于Java Web开发,如Struts、Hibernate和Tomcat,对于想要深入Web开发的人来说非常有价值。 接下来是C#。Charles Petzold被誉为"Windows编程泰山北斗",他的《C#程序设计》和《C#Windows程序...

    我国计算机书籍.pdf

    - 《C陷阱与缺陷》:Andrew Koenig的书,揭示了C语言中常见的陷阱和问题。 2. **Java语言**: - 《Java编程语言(第三版)》:由Java之父James Gosling撰写,深入浅出地讲解Java语言。 - 《Java编程思想(第2版...

    计算机经典图书.pdf

    - **《精通Struts》和《精通Hibernate》**:孙卫琴的两本书分别详细介绍了基于MVC的Java Web开发框架Struts和对象持久化技术Hibernate,是Web开发者的必备读物。 - **《Tomcat与Java Web开发技术详解》**:孙卫琴...

    计算机使图书大全用扫描.pdf

    此外,孙卫琴的《精通Struts》、《精通Hibernate》和《Tomcat与Java Web开发技术详解》为Java Web开发提供了深入的指南。 在C#领域,Charles Petzold的《C#程序设计》和《c#Windows程序设计》被喻为C#语言的权威之...

    计算机类书籍——经典必读.docx

    - 《精通Struts:基于MVC的Java Web设计与开发》、《精通Hibernate:Java对象持久化技术详解》和《Tomcat与Java Web开发技术详解》:孙卫琴的系列作品,针对Java Web开发的实践指南。 2. **C#**: - 《C#程序设计...

    软件经典书籍.DOC

    除了这些,文档还提到了Struts、Hibernate、Tomcat、图形编程、Unix、Linux、游戏编程、移动开发等领域的经典书籍,这些书籍都是相应领域专业人士提升技能的重要资料。 这些书籍的推荐列表为学习者提供了系统化的...

    讲师介绍

    在职业生涯中,张龙曾在理光软件研究所担任高级软件研究员及项目经理职务,在文档工作流系统与协同知识解决方案方面积累了丰富的经验,并对敏捷方法论有着深入的理解和应用。 #### 二、技术贡献 - **技术传播者**...

Global site tag (gtag.js) - Google Analytics