您的位置:首页 > 编程语言 > Java开发

Struts中文乱码解决实例(绝对经典)

2007-06-13 23:53 281 查看
两个礼拜才搞定Struts中文乱码,希望大家很认真的看这东西,相信对你有用。
也希望大家看了给我回复一些相关的经验为谢!

背景:
(1,页面介绍:我是从test.jsp(包含两个下面三个文本框) 通过下面的action跳转到success.jsp显示Name:<%= user.getUserName()%>
<html:form action="test.do" method="GET">
userName:<html:text property="user.userName"/><br/>
passWord:<html:text property="user.passWord"/><br/>
age: <html:text property="user.age"/><br/>
</html:form>

1.1,发送页面编码设置
jsp编码:<%@ page contentType="text/html;charset=gb2312" pageEncoding="GB2312" language="java" errorPage=""%>
html编码:<meta http-equiv="Content-Type" content="text/html; charset=GB2312"/>
1.2,接收页面编码设置同发送页面
(2,web.xml配置了的过滤
<web-app>
<filter>
<filter-name>Encoding Filter</filter-name>
<filter-class>com.encode.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>com.myaction.MyActionServlet</servlet-class>
</servlet>
</web-app>
(3,Struts的config配置
<struts-config>
<action path="/test"
type="test.UserAction"
name="userForm"
scope="request"
validate="true"
input="/test.jsp">
</action>
<forward name="userCreated" path="/success.jsp">
</forward>
<controller processorClass="com.encode.MyRequestProcessor"/>
</struts-config>
(4,后台java类说明:
(2 MyActionServlet是继承Struts的ActionServlet,重写process方法。
public class MyActionServlet extends ActionServlet{
private static final long serialVersionUID = 1L;
protected void process(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
/**@todo Override this org.apache.struts.action.ActionServlet method*/
request.setCharacterEncoding("gb2312");//就加着一行一切都解决了
System.out.println("Had Arive MyActionServlet !!!");
super.process(request, response);
}
}
(2中的EncodingFilter用来设置请求时的编码,代码重要部分如下:
public final class EncodingFilter implements Filter {
private String targetEncoding = "gb2312";
protected FilterConfig filterConfig;

public void init(FilterConfig config) throws ServletException {
this.filterConfig = config;
this.targetEncoding = config.getInitParameter("encoding");
System.out.println("filterConfig of init:!" + filterConfig);
System.out.println("targetEncoding of init:!" + this.targetEncoding);
System.out.println("Arive this Filter init!");
}
public void doFilter(ServletRequest srequest, ServletResponse sresponse,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) srequest;
request.setCharacterEncoding(targetEncoding);
System.out.println("request.getCharacterEncoding() do:"
+ request.getCharacterEncoding());
System.out.println("Arive this Filter doFilter!");
chain.doFilter(srequest, sresponse); // 把处理权发送到下一个
}
public void destroy() {
this.filterConfig = null;
}
public void setFilterConfig(final FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
}
(3中配置的UserAction类中:return mapping.findForward("userCreated");跳转到success页面
(3中的MyRequestProcessor类:
public class MyRequestProcessor extends RequestProcessor {
public MyRequestProcessor() {
}
protected boolean processPreprocess(HttpServletRequest request,HttpServletResponse response) {
try {
System.out.println("arivce MyRequestProcessor 字符集设置");
request.setCharacterEncoding("gb2312");// 在此设置字符集
} catch (Exception ex) {
System.out.println("字符集设置失败");
}
return true;
}
}
下面就是问题的经典处了:
当页面是直接从HTML标签里输出中文的情况下(如:<h2>测试STRUTS,获得参数</h2>)是能正确显示中文的。说明我的HTML解码没问题。
正如多数人遇到的乱码问题一样,当我在test.jsp页面输入英文或者数字的时候在success.jsp能够正常显示
当我输入中文时候,就输出的是"?"和一些乱码,我的最终配置成为上面背景中所示的版本是我一步一步边看各大高手的回答边改的结果。
当我通过http://localhost:8080/myWeb/test.jsp访问test.jsp页面的时候正如我期待的一样,所以java类用于调试的DEBUG一字不少的全部能够在后台清清楚楚的看到,
Filter的初始化System.out.println("filterConfig of init:!" + filterConfig);
真正doFilter:System.out.println("Arive this Filter doFilter!");
struts的controller:System.out.println("arivce MyRequestProcessor 字符集设置");
以上三个DEBUG已经能够充分检证到我页面提交数据的时候确实已经把请求时编码设置为gb2312了,但是我的页面为什么还是不能正常显示中文了,我都快疯了。

我看了很多类似问题的回答,看啊看,想啊想,但是我所期待的结果并没有跟我的付出成正比。
1)我看到:页面向服务器发送数据时好象都是以UTF-8编码发送的,由于UTF-8和gb2312互相转换的时候会出现好多意想不到的问题,所以乱码了。
2)我看到最多的是:改吧!request.setCharacterEncoding("gb2312")绝对可以让你的页面正常显示中文。
3)我也看到:做个Filter吧,Filter的配置<url-pattern>/*</url-pattern>会让你访问任何页面时候把请求编码设置为gb2312
4)我还看到:给Struts的Action做个<controller processorClass="com.encode.MyRequestProcessor"/>吧,这样应该就OK了
5)最后看到:做个自己的ActionServlet覆盖Struts的ActionServlet

我就是按照上面的步骤完成我在背景中所描述的那写配置的,第三步和第四步本来曾让我觉得100%能够解决掉我的乱码的,要不可能是我的人品有问题!
第五步更是曾让我一度欣慰,于是就有了背景[(2,web.xml配置]中的servlet了。
但是事与愿违,我开始思索:
是不是本就不应该request.setCharacterEncoding("gb2312"),是不是应该换种编码(比如GBK,UTF-8),也许你已经开始笑我了。
我还没那么傻,不是说默认就是以UTF-8编码方式发送数据的吗,所以我没有试过setCharacterEncoding("UTF-8"),但是我试过setCharacterEncoding("GBK"),
可想而知,问题肯定是没能解决的。
我不太明白编码原理,我只是大概知道什么UNICODE拉,gb2312拉一点点,反正我是不知道深一点的原理的。

今天晚上太幸运了,突然看到 一个回复method="GET"换成method="POST"试试,理由是:POST是以ISO-8859-1编码发送数据的(但是为什么ISO-8859-1行而UTF-8就不行呢)。
我抱着怀疑的态度改了,居然成功了,
看到页面上赫然的显示出我的大名的时候,我女朋友已经早睡着了,我很激动,本想和女朋友分享这个快乐的,可是又不忍心叫醒她,所以借着这股劲写下这点东西,
我相信回头看到我这篇东西我还是会感谢我的女朋友的,毕竟这是我第一篇有关于技术学习经验方面的东西,而且我已经很久没有写过东西了,能把我遇到的这个问题较好的描述出来已经很不错了。这时候已经很晚了。我想休息了。所以就这样了。

带着思考睡觉吧,我也希望有一天能够看到一篇有关于编码方面很好很好的技术文档,希望我的这篇东西对大家有点帮助,也希望每一个爱技术的人多多收获!
有关编码方面的东西我很想知道很多很多,嘿嘿~~~。居然是因为表单的提交method!!!汗
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: