说起来,接触struts2也已经差不多半个月了,虽然期间断断续续的看过一些书,但是花的时间并不多,认识也不是很到位。但是工作需要,也顾不了那么多了。struts2在中文的处理方面并没提供多大帮助,虽然内置个
<constant name="struts.i18n.encoding" value="UTF-8" />
关于这个变量,已经有人讨论过了,主要是对request,response的编码处理,在以前解决jsp+Servlet或struts乱码时,的确是加个过滤器,然后将request的Encoding设为UTF-8,但是struts2的struts.i18n.encoding看似与此过滤器差不多,还多做了点事(response),但是在传中文参数的时候还是会出现乱码:
<tr>
<td><s:property /></td>
<td>
<a href="<s:url value='download.action'> <s:param name='fileName'
value='fileFileName[#fn.getIndex()]'/>
</s:url>">下载</a>
</td>
</tr>
如果上面的文件名为中文,在action里面打印出的文件名还是乱码。于是开始怀疑struts.i18n.encoding这个参数到底起作用没有,经过在action的验证:
getRequest().getCharacterEncoding()
这个encoding确实是UTF-8,说明request的参数编码的确为UTF-8,那为什么中文文件名还是乱码呢?这个问题目前还不能合理的解释。于是只好手动来转码了:
String chineseFileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
虽然不能解释,但是这样做,的确能得到中文的文件名。但是还有另一个问题又产生了,下载中文文件名的附件会出现乱码问题。
public String getDownloadChineseFileName() throws UnsupportedEncodingException {
String downloadChineseFileName = fileName;
String chineseFileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
return downloadChineseFileName;
}
<action name="download" class="com.example.DownLoadAction">
<param name="fileName"></param>
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">downloadFile</param>
<param name="contentDisposition">
attachment;filename="${downloadChineseFileName}"
</param>
</result>
</action>
至少上面的中文文件名作为下载附件的名字时为乱码。
既然action内都是中文了,为什么下载的时候还会出现乱码呢?心想可能转过码的缘故,于是不转码了:
public String getDownloadChineseFileName() throws UnsupportedEncodingException {
return fileName;
}
然后测试,结果附件名成中文了,高兴了一下,但是不要慌,这只是在FF下的测试,在IE7上试了一下,结果依然乱码,我晕!这下让人犯难了,转与不转都有问题,该怎么办?没办法了,解决不了,于是去掌门人上玩了几把dota:奇怪的是,输的时候总是输得很干脆,赢的时候却总是赢得很艰难,每次赢的时候大家都神装了,打得那个吃力呀!
玩过几把后,回到原来的话题,中文附件问题到底该怎么办?心想,到action里既然是乱码,应该那是得转码,但是UTF-8码的确是有问题,于是把中文的文件名再转成ISO8859-1,我把上好的中文名再转成ISO8859-1,应该不会有问题了吧?于是这样:
public String getDownloadChineseFileName() throws UnsupportedEncodingException {
String downloadChineseFileName = fileName;
String chineseFileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
downloadChineseFileName = new String( chineseFileName.getBytes(), "ISO8859-1" );
return downloadChineseFileName;
}
经过FF与IE的测试都正常了,问题解决了。
后经过同事测试,发现编写下载链接代码时,如果直接使用<a href=....>时,如果中文的文件名太长,会出现 中文文件名+乱码+文件扩展名的情况,如中华人民共和国草案??.doc。因此最好还是用s:url标签。
不管怎么说,中文附件名的问题终于解决了,接触struts2时间不长,但是发现搞个东西还真不容易。因此撰写此文,希望能给哪怕只一个人提供一顶儿帮助也好。
PS:测试环境为
struts2.1.8.1
tomcat6.0.18
分享到:
相关推荐
struts2中文教程
Starting_struts2中文版 Starting_struts2中文版
Struts2中文教程,Struts2API
关于StrutsPrepareAndExecuteFilter最新的过滤器,在Struts.xml定义常量<constant name="struts.i18n.encoding" value="UTF-8"/>...关于Struts2各个版本、各种过滤器,用get方式提交都方法都无法解决的中文乱码问题。
转载struts2 中文手册,他人成果,本人转载分享
struts2官方文档
Struts 2是Struts的下一代产品,是在 struts 和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...
struts2的根本webwork2
Struts2-API+Struts2中文帮助文档。 API为英文格式,帮助文档记录了Struts2各大知识点的详细代码案例,不错的参考资料
struts下的汉字乱码问题 经过测试
01 为Struts 2.0做好准备 02 常用的Struts 2.0的标志(Tag) 03 Struts 2.0的Action讲解 04 在Struts 2.0中国际化(i18n)您的应用程序 05 转换器(Converter)——Struts 2.0中的魔术师 ...13 Struts 2与AJAX
Struts 2中文参考手册,Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,...
struts2 chm 程序包 org.apache.struts2 接口概要 接口 说明 StrutsStatics Constants used by Struts. 类概要 类 说明 RequestUtils Request handling utility class. ServletActionContext Web-specific ...
网上很多有关struts2的api文档都是不全的。我经过精心整理出的struts2api文档,非常齐全。
struts1和struts2中文教程..................
Struts 2实战,Struts 2 in action 的中文版,pdf格式,讲的是Struts 2。此书是Struts 2的一本很经典的书。花几块钱在网上买的。。。。
在struts官网下的struts2中没有帮助文档,几经周折找到的API文档,包括了struts中常用jar包(struts2-core,xwork-core等)!
struts2中文帮助文档,大家可以下载学习学习。方便随时查看。
一个struts2的用户管理实例,涉及增删改查。 主要用到的技术: 1.struts2 2.国际化 3.类型转换 4.struts标签
struts2中文乱码的解决DEMO,绝对可以运行。