我的问题对应的解决方案是:web.xml中filter的顺序问题【置顶】。需要将编码过滤器放置在所有过滤器之前。
在解决这个问题途中学习到的东西:
解决方案总结(post中文乱码):
- 前后台编码方式一致;
- 结合过滤器的使用;
- 表单传输方式的指定;
- Tomcat的server.xml;
1.前台:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%
request.setCharacterEncoding("UTF-8");
%>
2.后台Struts.xml配置文件:
<constant name="struts.i18n.encoding" value="UTF-8"/>
3.web.xml中的过滤器(以下两个都可以,择一即可)
<filter-name>CharEncodingFilter</filter-name>
<filter-class>com.sram.filter.CharEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
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;
public class CharEncodingFilter implements Filter{
String encoding;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
req.setCharacterEncoding(encoding);
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
encoding = config.getInitParameter("encoding");
if(encoding==null||encoding.equals("")){
encoding = "UTF-8";
}
}
}
4.将form表单提交方式变为post方式,即添加method="post"
5.Tomcat的server.xml没有配置编码,添加URIEncoding="UTF-8"就可以了
6.在action中重编码,在指定参数的set方法中,将编码设会“UTF-8",例如:需要修改每个参数的set方法,比较麻烦(不推荐)
public void setCopyRight(String copyRight){
try {
this .copyRight = java.net.URLDecoder.decode (copyRight, "UTF-8" );
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
补充post方式:
补充get方式:
如果提交方式为get,设置request对象的编码是无效的,想不乱码,只能手工转换。
1. String data = "???????";//乱码字符串
byte source [] = data.getBytes("iso8859-1");//得到客户机提交的原始数据
data = new String (data.getBytes("iso8859-1"),"UTF-8");//解决乱码
//等同于
data = new String (source,"UTF-8");
2.get方式的乱码,还可以通过更改服务器配置的方式实现。更改Tomact的conf目录下的server.xml文件。
2.1 这种方式并不推荐,因为更改了服务器且并不灵活。
2.2这么设置后,request的setCharacterEncoding设置什么编码,连接器就用什么编码,虽然比上一种更改灵活,但依然会导致我们的应用程序牢牢依赖于服务器,也不被推荐。
参考网址:http://www.cnblogs.com/yyz666/p/4051294.html
http://www.cnblogs.com/wanggangblog/p/3477525.html
http://www.cnblogs.com/chenssy/p/4220400.html
Struts2拦截器解决乱码问题http://blog.csdn.net/a9529lty/article/details/7069040