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

处理struts servlet jsp 中文乱码问题

2010-04-28 14:09 507 查看




针对get提交方式、乱码解决方式
tomcat5中,为了保证get数据采用GBK编码,在server.xml中进行了如下设置:改变web容器请求数据的编码格式(对post请求方式无效)
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />
注意:struts中过滤器、重写formBean里面reset方法、重写action里的processPreprocessor()方法 均对get请求无效

针对struts中post提交方式、乱码解决方式
方法一:注意processActionForm()方法,这个方法会先调用ActionForm的reset方法,所以你可以在你的ActionForm中重写reset方法,在其中进行编码设定如:request.setCharacterEncoding("utf-8");这里千万要注意的是,你设置的编码和发送请求的页面的编码必须一致。以下几个方法也是相同的。如果要使用Validator插件,我想使用了Struts都会用上的。那么在Validator中表单是使用ValidatorForm和DynaValidatorForm,他们都是ActionForm的子类,你也可以重写reset方法,当然最方便的还是写一个自己的基类扩展它们,而在其中只用重写reset()而不做其它操作,然后其他表单继承这个基类。这种方式的缺点是只能解决表单中文乱码问题。
public void reset(ActionMapping mapping, HttpServletRequest request) {
super.reset(mapping, request);
try {
request.setCharacterEncoding("GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
方法二:在Struts1.11版本之后,ActionServlet不再处理所有请求,而是把大部分请求抛给了RequestProcessor类,作为ActionServlet的助手.在它的process()方法中会调用16个方法.可以声明一个MyProRequestProcessor类继承RequestProcessor类,重写某个方法,添加编码的代码。如重写processPreprocessor()方法,这个方法在源码中没有任何逻辑操作,只是返回一个true还可以重写processContent(HttpServletRequest,HttpServletResponse)等方法,但是推荐还是重写上面的processPreprocess方法,因为里面没有任何逻辑代码,所以你不用担心会破环原来的处理过程。

public class MyProRequestProcessor extends RequestProcessor {
protected boolean processPreprocess(HttpServletRequest request,
HttpServletResponse response) {
try {
request.setCharacterEncoding("GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return true;
}
}
在struts-config.xml中设定控制器如下:
<controller processorClass="com.aptech.jb.filter.MyProRequestProcessor"/>

方法三:设置过滤器,这个方法是用的最多也是最方便的、可将Struts servlet jsp中文乱码问题一网打尽。写一个实现了javax.servlet.Filter接口的类.
public class SetCharacterEncodingFilter implements Filter
{
String encoding = "";
public void init(FilterConfig filterConfig) throws ServletException
{
encoding = filterConfig.getInitParameter("encoding");
if(encoding==null)
encoding = "GBK";
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException
{
if (request.getCharacterEncoding() == null)
{
request.setCharacterEncoding(encoding);
}
response.setContentType("text/html; charset="+encoding);
chain.doFilter(request, response);
}

public void destroy()
{
this.encoding = null;
}
}
配置这个过滤器,在web.xml文件中加入如下语句
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>com.aptech.jb.filter.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

最后千万要注意的是:你所设定的支持中文的编码一定要和页面的编码一致。否则一样是乱码!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: