虽然在servlet中加入代码:
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
可以使从jsp得到的中文内容不是乱码。
但是在doGet()方法中仍然可能是中文乱码,所以我们想到了加过滤器,很简单的一个过滤器:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String method = ((HttpServletRequest)request).getMethod();
if("get".equalsIgnoreCase(method)){
//使用包装过的request对象,从而getParameter()方法就是装饰好了的,这里其实用到了一种装饰者模式,有兴趣的可以去搜着看一看
request = new CharacteRequestWrapper((HttpServletRequest)request);
}
chain.doFilter(request, response);
}
//装饰者,将getParameter()方法进行包装
class CharacteRequestWrapper extends HttpServletRequestWrapper{
public CharacteRequestWrapper(HttpServletRequest request) {
super(request);
// TODO Auto-generated constructor stub
}
@Override
public String getParameter(String name) {
String rightStr = super.getParameter(name);
try {
if(rightStr!=null){
rightStr = new String(rightStr.getBytes("ISO-8859-1"),"utf-8");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("\n已经进入装饰好的getParameter()方法,即中文乱码已经转码成功\n");
return rightStr;
}
}