处理struts servlet jsp 中文乱码问题

欢迎访问北大青鸟大连鑫鼎中心 www.0411bdqn.com

 

针对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>

最后千万要注意的是:你所设定的支持中文的编码一定要和页面的编码一致。否则一样是乱码!

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页