首先强烈抗议CSDN Blog的速度实在是太差,发表个帖子,错误不断,还害我辛辛苦苦写的东西全部丢失 :( 。
本次项目总结的第一部分主要是记录框架搭建的关键配置文件和一些容易出错的地方,第二部分我将记录乱码问题和处理方案。本次项目开发过程中碰见了许许多多乱码的问题,希望这个记录对以后开发会有帮助。具体的乱码错误和相应的解决方案如下:
1. 由于Java默认使用UTF-8编码,而且网上很多人都建议Struts开发的时候应尽量选用UTF-8做为默认编码,而非GBK。IDE使用Eclipse,在第一次使用Eclipse的时候应将default text editor改为UTF-8编码,免得日后后悔再改就惨了,我本次开发的时候就忽视了这一点,刚开始没注意,结果到快交工时乱码问题无法解决,导致将所有的文件全部修改一遍,呜……
2.
使用
SetCharacterEncodingFilter
,
这个很基础的一套过滤器,将所有来自页面的POST请求全部过滤为UTF-8编码。
3.
将JSP页面全部改为charset=UTF-8,这样可以保证与后台交互的时候都是UTF-8编码,一般应用做了以上工作就基本可以应付了。
4.
国际化问题,在使用资源文件的时候,由于中文在properties文件中无法被程序所识别,需要将其进行转码,我在资源文件下面制作了一个很简单的bat文件,每次修改资源文件的时候都是在一个临时文件中修改,然后执行这个bat文件,将其转化并保存为所需要的资源文件,这个动作挺烦的,也有项目组成员使用一些插件,但是那些东西都是直接写UTF-8码的,有时候反倒不方便,不过以后任务量巨大的时候可能会考虑使用。Bat文件内容:
set path=%path%;%JAVA_HOME%/bin/
,native2ascii -encoding UTF-8 ApplicationResources_bk.txt > ApplicationResources_zh.properties
5.
在本项目中大量采用了get方式提交请求并附加参数,结果导致编码乱码,原因是Tomcat默认请求编码是ISO8859,需要在Tomcat的配置文件server.xml
添加一个参数,URIEncoding=”UTF-8”,这样请求中附件的参数就会以UTF-8来进行编码。
6.
本项目中还少量使用到Ajax,JS也是默认使用ISO8859编码,所以在进行请求时遇到中文参数需要进行编码,如:var url = "GetSelectListAction.do?queryData=subTrade" + "&queryId=" + encodeURI(obj.value) + "&r=" + Math.random();
这里有两个地方需要注意:第一个地方是encodeURI(),方法,可以将参数进行转码,默认是转化为UTF-8,如果需要转为其他码制,需要在方法中添加第二个参数。第二个地方是Math.random(),由于Ajax有缓存机制,在接受请求的时候第一时间先判断该请求的地址是否被访问过,如果被访问过则直接使用缓存中的内容返回,这个东西很讨厌,客户在访问过一次出错后以后每次出现的都是这个错误,所以在请求中给其增加一个时间戳,只要可以随机生成一个不同的字串就可以,保证Ajax每次都去访问服务器。
7.
在项目即将交工的时候突然又出现乱码问题,发现对于超长的汉字做为参数传递仍然会出现乱码问题,解决方法是采用
java.net.URLEncoder
的Encode方法强制转码,缺点是会使JSP页面代码相当的长,但是目前还没有其他好的解决办法,我想最好的办法就是不用中文做为参数传递 :P,写法如:<a href="CreditInfoHonorPreAction.do?action=query&honorId=<bean:write name="honorInfoId" property="id" />&comName=<%= java.net.URLEncoder.encode(((com.shpcims.web.creditinfo.form.CreditInfoDetailInfoForm)pageContext.getRequest().getAttribute("creditInfoDetailInfoForm")).getCompanyName(),"UTF-8")%>®No=<%= java.net.URLEncoder.encode(((com.shpcims.web.creditinfo.form.CreditInfoDetailInfoForm)pageContext.getRequest().getAttribute("creditInfoDetailInfoForm")).getRegisterNo(),"UTF-8")%>">
至此,项目中疯狂的乱码问题才得以有效的控制,如果再出现问题真的要考虑是否出现了人品问题咯 :( 。这个乱码问题在整个项目开发过程中始终伴随着,简直就是梦靥。