首页 > 代码库 > struts2乱码

struts2乱码

今天遇到Struts2中,完成一个action以后,通过

<action name="saveDir" class="directorySaveAction" >
   <result type="redirect-action">
    <param name="actionName">listDirByParent</param>
    <param name="dirId">${directory.parentId}</param>
    <param name="child.id">${directory.id}</param>
    <param name="child.name">${directory.name}</param>
    <param name="from">${from}</param>
   </result>
  </action>

将请求转发到另一个action的时候,出现了中文乱码。一直以为是在这里用ognl表达式取出来的时候就乱码了,后来调了一天,想了想,才发现,这里执 行完saveDir的action以后,转发方式是redirect,那么就相当于是在地址栏重新输入,下面这个action的地址了,然后加上后面的参 数。那么就相当于你自己在地址栏输入listDirByParent.action?child.name=中文。。。,那么这样的请求属于get方式请 求,不会通过过滤器进行过滤,而是通过tomcat进行地址的编码,而tomcat的编码,我记得是iso-8809-1,那么在action端 Struts2默认是utf-8的编码方式,所以编码跟解码的方式出现了不符,就会出现乱码了。那么解决办法就是,直接在tomcat的 server.xml中修改下面这段

 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />其中加粗的是添加的内容。

修改完以后,ok了。

 

----

今天一个师弟 照我的方式改了,说还是不行。后来测试了一下发现,tomcat 没有问题,但是action的result那边出问题了,他是这样写的

<result type="redirect">listResponse.action?forumAreaId=${forumAreaId}&amp;forumPostsId=${topicId}&amp;isResponse=${isResponse}&amp;searchType=${searchType}&amp;key=${key}</result>

其中key这个值是中文的,也就是说没有通过param 标签来写。就出问题了。不知道为什么,所以还是使用param来设置参数比较好。

------------------------------------------------------------------------------------------------

中文乱码,首先要区分是页面乱码、action乱码,还是数据库乱码。大致的原理是java使用unicode编码-->window使用gbk(gb2312的扩展集)--mysql默认使用utf-8(unicode的一种

编码方法),这样转来转去就乱码了^_^。解决方法如下:
   1. 在struts2里面,最好将所有字符都设成utf-8。
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page pageEncoding="UTF-8" %>
   1.1 在jsp页面设定字符编码。这边有必有说明的是如果是jsp+java bean+servlet的方案,中文乱码很好解决,统一设成gb2312就可以了。
    1.2 使用struts框架字符集不能设成gb2312,要改成utf-8。
   2. 在struts.properties 添加:
struts.devMode=false
struts.enable.DynamicMethodInvocation=true
struts.i18n.reload=true
struts.ui.theme=simple

struts.locale=zh_CN
struts.i18n.encoding=UTF-8

struts.serve.static.browserCache=false
struts.url.includeParams=none
 

其中locale、encoding就是字符集的设定了。

   3. 在web.xml加个filter

  <!-- zh-cn encoding -->
    <filter>
        <filter-name>struts-cleanup</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ActionContextCleanUp
        </filter-class>
    </filter> 
    <filter-mapping>
        <filter-name>struts-cleanup</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

-------------------------------------------------------------------------------------------------

struts2标签不显示Label的解决方法  

最近发现struts2的标签不管是<s:textfield>还是<s:password>一概不显示label了,连换行都不换了。
查找原因有三种情况:
1、发现原来struts.properties下多了这句话:
struts.ui.theme=simple
2、struts2.xml 中有
 <constant name="struts.ui.theme" value="http://www.mamicode.com/simple" />
3、 jsp页面form标签有属性 theme="simple"如果想不显示Label值 就加上
-------------------------------------------------------------------------------------------------

spring+hibernate+struts2应用mysql数据库乱码问题 -hxzon动手 -gdo

hxzon:
在spring配置文件里url末尾添加
?characterEncoding=gbk,没有变化。
在struts配置文件里写
<constant name="struts.i18n.encoding" value="http://www.mamicode.com/UTF-8" />
还是乱码。
最后发现jsp页面里没改过来。
改为<%@ page language="java" pageEncoding="UTF-8"%>
不再乱码,而且去掉spring里写的那一句,也没乱码。
补充:spring中应该用转义字符才行。
<property name="url"
            value="http://www.mamicode.com/jdbc:mysql://localhost/mysql?useUnicode=true&characterEncoding=gbk"/>
数据库默认latin1,数据库建表默认utf8,连接使用gbk,中文不再乱码。
---相关资料-----------------------------------
       今天用spring+hibernate+struts2写了一个简单的示例程序,使用spring来管理hibernate处理数据,整合了 struts2,用了很长时间的webwork,使用struts2也还算是顺手,显示测试数据很顺利,当开始测试录入数据功能时,录入汉字发生了问题, 录入的汉字全部成了乱码。

     最开始认为是在tomcat中中文传输出现了问题,加入了中文过滤器,但问题没有解决,忽然想到了在struts2的属性文件中已经设置了编码为gbk:
struts.properties
struts.i18n.encoding=GBK  
struts.objectFactory=spring    
应该不是在传输过程出的问题,在后台输入传入Action和Dao的数据,也全部能正常显示。
然后怀疑是mysql的设置问题,查找设置mysql的数据库编码设置方法,在设置后仍没有解决问题。
直接在mysql中执行Insert into user (‘nam‘) values(‘汉字‘),mysql执行后数据显示正常,说明数据库的编码也正确。
郁闷了,到底问题处在哪里?在执行hibernateTemplate的save()方法之前,没有出现中文乱码问题,在数据库这方面也测试没有中文乱码问题,只有在hibernate持久化层这里的问题了。
查找持久化层传输数据到数据库服务器出现乱码的问题,终于找到了问题:
hibernate持久化层在传输过程中未设置编码格式,这样在传输数据到数据库服务器后已经是乱码了,在oracle和sqlserver里没有出现传输乱码问题,所以没有想到会使这里的问题。
修改spring中关于数据源的配置参数:
数据库链接方式:

   jdbc:mysql://localhost:3306/springexample?characterEncoding=utf-8
  
在执行数据录入后,终于中文显示正常了。
在应用hibernate管理mysql数据库是不仅要注意web服务器和数据库的编码问题,同样要注意持久化层数据传输的编码问题。

struts2乱码