偶尔弄了下struts2,spring,hibernate3整合,再实现一个查询功能的时候忽然发现,查询的条件有中文的时候会出现乱码问题,没道理啊,我的web.xml中都已经制定了编码方式为UTF-8,struts的配置文件中也设置了<constant name="struts.i18n.encoding" value="utf-8" /> 为啥在后台看到的中文依旧是乱码呢。开始的时候我还以为是跟数据库的编码方式不一致的问题造成的,后来在firebug中查看传递的参数编码方式没有问题,那问题就一定出现在struts的过滤器上面了,自己弄了许久都没解决,后来在网上查了下,原来是struts2.1.6自身的的一个bug,中文乱码出现问题的地方,jsp post/get,action中接收的参数。

   一般情况下,只要设置编码方式跟页面显示指定的编码方式都是一样的话,是没有乱码出现的。其实要解决上述的问题不算很麻烦,我们只要自己手动写个字符filter就行了,

package com.books.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 此编码过滤器适用于解决struts2.1.6
 * 前台jsp页面的中文传入action出现乱码
 *
 * @author
 *
 */
public class EncodingConvertFilter implements Filter {
    @Override
    public void destroy() {
                                                          
    }
    @Override
    public void doFilter(ServletRequest req, ServletResponse rsp,
            FilterChain fc) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) req;
        HttpServletResponse response=(HttpServletResponse) rsp;
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        fc.doFilter(request, response);
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
                                                          
    }
}

这个filter写好之后,需要在web.xml中进行配置,如下所示

<filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
<filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>com.books.util.EncodingConvertFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
                                          
    <!-- struts2.1.3之后采用此方法,因为在2.1.3版本之后中的FilterDispatcher标记为过时 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

需要注意的是,自己写的filter在web.xml中要放在spring的encoding之后,struts的filter之前,因为放的顺序不同产生的效果也是完全不一样的。