设为首页 收藏本站
查看: 383|回复: 0

[经验分享] 再论Tomcat和STRUTS中的中文问题

[复制链接]

尚未签到

发表于 2017-1-31 06:29:47 | 显示全部楼层 |阅读模式
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中存储的表单数据了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-335470-1-1.html 上篇帖子: Tomcat启动完成后再执行一个指定的方法 下篇帖子: ActiveMq-JMS简单实例使用tomcat
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表