java语言虽然天生支持国际化语言,但在项目实践中仍然会遇到中文乱码问题。
Struts2提供的默认过滤器虽然可在一定程度上支持编码处理,但过滤器的配置不当或JSP页面编码不当,中文乱码问题仍会出现。
最新的Tomcat(包括Tomcat6及以上版本)在对待POST请求和GET请求时的处理方式并不一致,请注意。
环境:Tomcat6.0 + MySQL 5 + Struts2
编码:UTF-8
1.MySQL数据库编码
对于MySQL中新创建的数据库采用UTF-8编码
2.Tomcat服务器设置
在server.xml文件中配置Connector标签下的URIEncoding,server.xml在conf目录下
<connector connectiontimeout="20000"
port="8080" protocol="HTTP/1.1" redirectport="8443" uriencoding="UTF-8">
</connector>
3.JSP页面编码
<%@ page language="jsp" import="java.util.*" pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
注意:pageEncoding和charset需要同时设置
4.在web.xml文件中配置struts2和编码相关的拦截器
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:这个拦截器要放置在默认拦截器之前才能对编码生效。
如果实现了以上4步基本就可以解决Struts2项目中的GET请求(不包括客户端Ajax的GET请求,如何处理Ajax请求中的乱码问题,请参考下篇博客)
对于POST请求,最常用的方法就是编写过滤器在过滤器中进行编码,接下来看如何使用过滤器来处理POST请求。
5.编写过滤器
假设过滤器类名为CharsetEncodingFilter,在filter的doFilter()方法中设置编码。encoding是filter配置中的参数,值是UTF-8。
@Override
public void doFilter(ServletRequest sRequest, ServletResponse sResponse,
FilterChain filterChain) throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest) sRequest;
HttpServletResponse response = (HttpServletResponse) sResponse;
// 设置字符集
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
filterChain.doFilter(request, response);
}
@Override
public void init(FilterConfig config) throws ServletException
{
encoding = config.getInitParameter("encoding");
}
6.在web.xml文件中配置filter
<filter>
<filter-name>charsetEncoding</filter-name>
<filter-class>web.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charsetEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在这里为filter设置了一个init-param,值为UTF-8(见第5步)
在这一步需要特别注意的是fiter配置放置的位置:需要放置在第4步中编码拦截器的前面。否则的话对于POST请求仍然会出现乱码。
因而最终的顺序如下:
<filter>
<filter-name>charsetEncoding</filter-name>
<filter-class>web.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charsetEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
经过以上6步处理后即可解决POST请求中的中文乱码问题。
Struts2提供的默认过滤器虽然可在一定程度上支持编码处理,但过滤器的配置不当或JSP页面编码不当,中文乱码问题仍会出现。
最新的Tomcat(包括Tomcat6及以上版本)在对待POST请求和GET请求时的处理方式并不一致,请注意。
环境:Tomcat6.0 + MySQL 5 + Struts2
编码:UTF-8
1.MySQL数据库编码
对于MySQL中新创建的数据库采用UTF-8编码
2.Tomcat服务器设置
在server.xml文件中配置Connector标签下的URIEncoding,server.xml在conf目录下
<connector connectiontimeout="20000"
port="8080" protocol="HTTP/1.1" redirectport="8443" uriencoding="UTF-8">
</connector>
3.JSP页面编码
<%@ page language="jsp" import="java.util.*" pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
注意:pageEncoding和charset需要同时设置
4.在web.xml文件中配置struts2和编码相关的拦截器
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:这个拦截器要放置在默认拦截器之前才能对编码生效。
如果实现了以上4步基本就可以解决Struts2项目中的GET请求(不包括客户端Ajax的GET请求,如何处理Ajax请求中的乱码问题,请参考下篇博客)
对于POST请求,最常用的方法就是编写过滤器在过滤器中进行编码,接下来看如何使用过滤器来处理POST请求。
5.编写过滤器
假设过滤器类名为CharsetEncodingFilter,在filter的doFilter()方法中设置编码。encoding是filter配置中的参数,值是UTF-8。
@Override
public void doFilter(ServletRequest sRequest, ServletResponse sResponse,
FilterChain filterChain) throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest) sRequest;
HttpServletResponse response = (HttpServletResponse) sResponse;
// 设置字符集
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
filterChain.doFilter(request, response);
}
@Override
public void init(FilterConfig config) throws ServletException
{
encoding = config.getInitParameter("encoding");
}
6.在web.xml文件中配置filter
<filter>
<filter-name>charsetEncoding</filter-name>
<filter-class>web.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charsetEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在这里为filter设置了一个init-param,值为UTF-8(见第5步)
在这一步需要特别注意的是fiter配置放置的位置:需要放置在第4步中编码拦截器的前面。否则的话对于POST请求仍然会出现乱码。
因而最终的顺序如下:
<filter>
<filter-name>charsetEncoding</filter-name>
<filter-class>web.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charsetEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
经过以上6步处理后即可解决POST请求中的中文乱码问题。