可能很多人都遇到过和我一样的问题:不知道是什么原因,在写Servlet和Jsp的时候也是乱码不能解决,因为写的过滤器根本就没有起作用。现在到了Struts,还是有这个问题。郁闷好久了,上网搜了好久都是使用过滤器看起来最方便,其实也是。但是还是不起作用,我的方法都是post不知道为什么。今天深入了解Struts工作原理后,发现有一个地方可以设定编码,当然不是指的controller里面,在controller里面设定了contentType=”text/html;gb2312”结果也没有用。而且我所有页面也统一使用gb2312。
下面大概说一下Struts处理request的过程,当然第一是被ActionServlet控制器拦截请求,然后ActionServlet在doPost和doGet方法中都会调用一个具体干事的方法process(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{……………}这个方法是RequestProcessor的方法,这个类是struts1.1中作为ActionServlet的助手类出现的,大部分工作都交给它处理了。在它的process()方法中会调用16个方法
方法一:注意processActionForm()方法,这个方法会先调用ActionForm的reset方法,所以你可以在你的ActionForm中重写reset方法,在其中进行编码设定如:request.setCharacterEncoding(“utf-8”);这里千万要注意的是,你设置的编码和发送请求的页面的编码必须,注意是必须一致。一下几个方法也是相同的。如果要使用Validator插件,我想使用了Struts都会用上的。那么在Validator中表单是使用ValidatorForm和DynaValidatorForm,他们都是ActionForm的子类,你也可以重写reset方法,当然最方便的还是写一个自己的基类扩展它们,而在其中只用重写reset()而不做其它操作,然后其他表单继承这个基类。这种方式的缺点是只能解决表单中文乱码问题。
方法二:查看源码可以发现上面RequestProcessor中的方法很多参数都是HttpServletRequest和HttpServletResponse,所以第二种方法是扩张RequestProcessor类,重写某个方法,添加编码的代码。如重写processPreprocessor()方法,这个方法在源码中没有任何逻辑操作,只是返回一个true
重写如下
还可以重写processContent(HttpServletRequest,HttpServletResponse)等方法,但是推荐还是重写上面的processPreprocess方法,因为里面没有任何逻辑代码,所以你不用担心会破环原来的处理过程。现在要做的就是在struts-config.xml中设定控制器如下:
重启tomcat验证
方法三:设置过滤器,这个方法是用的最郁闷的,但是不能否认还是很方便1、写一个实现了javax.servlet.Filter接口的类
第二是配置这个过滤器,在web.xml文件中加入如下语句
最后千万要注意的是:你所设定的支持中文的编码一定要和页面的编码一致。否则一样是乱码!