`

struts2中文问题

阅读更多
说起来,接触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

分享到:
评论
10 楼 Purking 2010-01-30  
luckaway 写道
fansofjava 写道
暂且不说,能不能通过修改server.xml来解决问题(很可能行),就算解决了,也是基于
特定容器,如果以后换作其它的服务器,是不是又要回过头来解决乱码问题呢?而且如果
真修改服务器的编码方式,那
struts.i18n.encoding=UTF-8拿来又有何用?

tomcat5.0之后post提交和get提交编码已经分开处理了!!!
虽然这个特性可能不是基于Servlet规范的,但是把两个编码设置成一致,绝对不会只跟tomcat这个特定容器绑定死,相反如果你get编码和post编码不一致,才有可能导致无法迁移到其他容器去,因为其他的容器可能并不支持分开设置,意味着你只能称设置一个编码。

所以,建议LZ把两个编码设置成一样!


支持, 并且汉字乱码问题 GET 与 POST 参数的提交的处理方式是不同的;
对于 Struts2 内置的汉字编码过滤器我研究过, 可以看看我的 Blog:
      blog.csdn.net/Purking
9 楼 huhuanqadn 2010-01-29  
我一直是保证页面编码与容器编码一致的,这样是不会出现乱码的。
8 楼 yipbxx 2010-01-29  
页面加上 pageEncoding="UTF-8",在配置个过滤器看看,修改tomcat编码集一般不建议这样做吧
7 楼 sarin 2010-01-28  
下载我是这么做的
downloadName = URLEncoder.encode(downloadName, Constants.ENCODING);

设置的系统常量UTF-8
6 楼 luckaway 2010-01-28  
fansofjava 写道
暂且不说,能不能通过修改server.xml来解决问题(很可能行),就算解决了,也是基于
特定容器,如果以后换作其它的服务器,是不是又要回过头来解决乱码问题呢?而且如果
真修改服务器的编码方式,那
struts.i18n.encoding=UTF-8拿来又有何用?

tomcat5.0之后post提交和get提交编码已经分开处理了!!!
虽然这个特性可能不是基于Servlet规范的,但是把两个编码设置成一致,绝对不会只跟tomcat这个特定容器绑定死,相反如果你get编码和post编码不一致,才有可能导致无法迁移到其他容器去,因为其他的容器可能并不支持分开设置,意味着你只能称设置一个编码。

所以,建议LZ把两个编码设置成一样!
5 楼 fansofjava 2010-01-28  
暂且不说,能不能通过修改server.xml来解决问题(很可能行),就算解决了,也是基于
特定容器,如果以后换作其它的服务器,是不是又要回过头来解决乱码问题呢?而且如果
真修改服务器的编码方式,那
struts.i18n.encoding=UTF-8拿来又有何用?
4 楼 skzr.org 2010-01-28  
withoutmark 写道
那是因为你的tomcat 容器或者was对url还进行了一次转码吧?

正解:只要配置tomcat的connect加上编码就可以了:useBodyEncodingForURI="true" URIEncoding="UTF-8"
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="UTF-8" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json,application/xml"/>
3 楼 fansofjava 2010-01-27  
虽然IE下的确有很多问题,但是还是不明白为什么struts.i18n.encoding=UTF-8没起作用。虽然在action内获取的request编码依然为UTF-8,但是参数为什么还是乱码,还得转码?
2 楼 zhangjunji111 2010-01-27  
楼主用的是不是IE6的浏览器?上次也遇到一个类似的问题,在IE6下面,url后面如果跟中文,并且为13个汉字就会出现乱码问题。在IE7下面每页这个错误。
1 楼 withoutmark 2010-01-27  
那是因为你的tomcat 容器或者was对url还进行了一次转码吧?

相关推荐

    struts中文乱码问题解决详细步骤

    3. **配置Struts2**:在Struts2的配置文件`struts-default.xml`或自定义的配置文件中,设置全局结果类型`stream`的编码: ```xml &lt;constant name="struts.i18n.encoding" value="UTF-8"/&gt; ``` **方法二:配置...

    struts2中文学习文档

    从给定的文件信息来看,标题“struts2中文学习文档”和描述“struts2的根本webwork2”表明这是一份关于Struts2框架的学习资料,特别强调了Struts2与WebWork2的关系。Struts2是Apache Struts的一个版本,它是一个用于...

    Struts2中文乱码问题最终解决方案

    在Struts2的各个版本和不同过滤器设置下,GET方式提交的中文乱码问题仍然存在。一种可行的解决方案是在Tomcat服务器的配置文件`server.xml`中,修改`&lt;Connector&gt;`标签,添加`URIEncoding="UTF-8"`属性。这将强制...

    struts2 中文手册

    这个“struts2 中文手册”提供了一份详细的指南,旨在帮助开发者理解和运用Struts2框架的各项功能。 Struts2的核心是模型-视图-控制器(MVC)设计模式,它简化了开发过程,将业务逻辑、数据和用户界面分离开来。...

    struts中文问题,struts国际化问题——终极解决方案

    ### Struts中文问题与国际化问题——终极解决方案深度解析 #### 引言 在Web应用开发中,特别是使用Struts框架时,中文显示和国际化(Internationalization,简称i18n)问题是开发者常遇的挑战。本文将深入探讨解决...

    Struts2-API+Struts2中文帮助文档

    文档中还会讲解如何使用Struts2的异常处理机制,以及如何调试和解决常见的运行时问题。 总的来说,这个压缩包对于想深入理解并熟练掌握Struts2框架的开发者来说是宝贵的资源。通过API文档可以了解框架的底层机制,...

    struts2中文教程

    Struts2是一个强大的Java EE应用程序框架,主要用于构建企业级的Web应用。它基于MVC(Model-View-Controller)设计模式,提供了一种组织应用程序结构和控制流程的方式,简化了开发过程。本教程将深入讲解Struts2的...

    Struts2中文教程,Struts2API

    在“Struts2中文教程”中,你可以找到关于这个框架的基础知识,包括安装配置、Action类、结果类型、拦截器等关键概念的详细介绍。教程通常会从最基础的环境搭建开始,教你如何配置Struts2的核心库和web.xml文件,...

    struts2中文乱码问题

    ### Struts2中文乱码问题解决方案 在使用Struts2框架进行Web开发的过程中,中文乱码问题是一个常见的问题。这不仅影响用户体验,还可能导致数据处理错误。本文将详细介绍几种解决Struts2中文乱码问题的方法。 ####...

    struts解决中文乱码问题

    在开发Web应用程序时,中文乱码问题是一个常见的挑战,特别是在使用Struts框架的时候。这个问题的出现通常是由于客户端和服务器端的字符集不一致导致的。本文将深入探讨如何解决Struts框架下的中文乱码问题。 首先...

    struts2中文帮助文档

    这份文档不仅覆盖了基础概念,还深入到了实际开发中可能遇到的问题和解决方案,对于学习和提升Struts2开发技能非常有帮助。无论是初学者还是经验丰富的开发者,都应该充分利用这份资源,以提升项目开发的效率和质量...

    Struts 2实战 Struts 2 in action 的中文版

    根据提供的信息,我们可以推断出这是一本关于Struts 2框架的书籍——《Struts 2实战 Struts 2 in action 的中文版》。本书主要介绍了Struts 2框架的相关概念、工作原理以及实际应用案例等内容。接下来,我们将根据...

    Struts 2中文帮助文档

    Struts 2是Struts的下一代产品,是在 struts 和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...

    struts2的中文乱码问题解决

    ### Struts2中文乱码问题解决方案 在使用Struts2框架进行Web开发的过程中,中文乱码问题是一个常见的挑战。这不仅影响用户体验,还可能导致数据不一致等问题。为了解决这一问题,我们需要理解其背后的原理,并采取...

    struts1和struts2中文教程

    Struts是Apache软件基金会下的一个开源项目,主要提供MVC(Model-View-...阅读Struts1.pdf文档,将帮助你掌握Struts1的基础知识,而struts2中文教程.chm将引导你进入Struts2的世界,深入学习其高级特性和最佳实践。

    eclipse struts 中文乱码问题图解

    在开发Java Web应用程序时,Eclipse和Struts框架的组合可能会遇到中文乱码的问题,这主要涉及三个方面:页面乱码、参数乱码以及国际化乱码。以下是对这些乱码问题的详细解答: 1. 页面乱码: 当网页编码设置为非...

    struts2 API帮助文档

    Struts2是一个强大的Java web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。这个API帮助文档是开发者在使用Struts2框架时的重要参考资料,它详细阐述了框架的各种组件、类库和方法,有助于理解并有效...

    Struts2.0视频教程+struts2.0中文教程

    7. **安全考虑**:讨论Struts2的安全问题,如XSS、CSRF等,并提供相应的防护策略。 通过这些教程,学习者不仅可以理解Struts2的基本原理,还能掌握实际开发中的最佳实践。深入学习和实践这些内容,将有助于提升Java...

Global site tag (gtag.js) - Google Analytics