浏览 5821 次
锁定老帖子 主题:再论Tomcat和STRUTS中的中文问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (8) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-01
中文问题有两个方面: (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中存储的表单数据了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-01-18
(3)对于Tomcat5.x,在上述步骤的基础上,只要修改安装目录中的config/server.xml,添加参数URIEncoding,将其设置为UTF-8。
你说只要这个地方设置与页面上统一,就可以了,我发现我把这个地方改成了,UTF-8能后页面上是gbk,也没有什么问题.这个地方,还是不理解. |
|
返回顶楼 | |
发表时间:2008-01-19
gazhangting 写道 (3)对于Tomcat5.x,在上述步骤的基础上,只要修改安装目录中的config/server.xml,添加参数URIEncoding,将其设置为UTF-8。
你说只要这个地方设置与页面上统一,就可以了,我发现我把这个地方改成了,UTF-8能后页面上是gbk,也没有什么问题.这个地方,还是不理解. URIEncoding影响的是tomcat如何解释get方式通过url传递的参数,post的是另外的。 显示跟接受时解码没关系. |
|
返回顶楼 | |
发表时间:2008-01-19
server.xml
useBodyEncodingForURI="true" 这个参数扩展性更好,表示以页面的编码作为request默认编码. |
|
返回顶楼 | |