偶尔弄了下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之前,因为放的顺序不同产生的效果也是完全不一样的。