首页 > 代码库 > 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}&forumPostsId=${topicId}&isResponse=${isResponse}&searchType=${searchType}&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的解决方法
查找原因有三种情况:
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也还算是顺手,显示测试数据很顺利,当开始测试录入数据功能时,录入汉字发生了问题, 录入的汉字全部成了乱码。
struts.i18n.encoding=GBK
struts.objectFactory=spring
jdbc:mysql://localhost:3306/springexample?characterEncoding=utf-8
struts2乱码