对于初学者来说乱码是最烦人的了,下面我们仅需写两个类就能解决你所开发的一个web项目所有页面的乱码问题。Let’s get it!
创建一个过滤器:EncodingFilter .java(不要忘记在web.xml中进行配置)
package cn.itcast.web.filter;
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;
/**
* 这个过滤器过滤所有页面
* @author WenHuagang
*
*/
public class EncodingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
//处理响应编码问题
response.setContentType("text/html;charset=utf-8");
//处理Post请求编码?一句话解决
request.setCharacterEncoding("utf-8");
/*
* 重点是:处理GET请求编码?
*
* 最简单的方法:解了重编
* 这个方法对于大量参数行不通,太麻烦!
* String username = request.getParameter("username");
*username = new String(username.getBytes("ISO-8859-1"), "utf-8");
*
*/
/*换个思路:
* 现在我要替换这个request.getParameter("username");中的request对象,
* 在这个方法调用之前解决完乱码问题,这时的request域中的参数的编码已被处理
*/
/*
* 具体解决方案:
*
* 调包request
* 1.写一个request的装饰类
* 将request中的getParameter()方法进行增强.
* 2.在放行时,使用我们自己的request
*/
if(req.getMethod().equals("GET")) {
//如果是GET请求就调包request,并放行装饰之后的request
EncodingRequest er = new EncodingRequest(req);
chain.doFilter(er, response);
} else if(req.getMethod().equals("POST")) {
//POST请求不用调包
chain.doFilter(request, response);
}
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
创建一个辅助类:EncodingRequest .java
package cn.itcast.web.filter;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 装饰类
* 装饰request对象
* @author WenHuagang
*
*/
public class EncodingRequest extends HttpServletRequestWrapper{
private HttpServletRequest req;
/*
* 装饰者模式:是你,还有你,一切拜托你
* 但是在这时java为我们提供了一个可以直接继承的父类HttpServletRequestWrapper
* 这个类已经帮我们完成了;一切拜托你
* 我们只需要重写增强的方法即可
*/
public EncodingRequest(HttpServletRequest request) {
super(request);
this.req=request;
}
public String getParameter(String name) {
String value = req.getParameter(name);
//处理编码问题
try {
value = new String(value.getBytes("ISO-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return value;
}
}
web.xml中的配置
<filter>
<display-name>EncodingFilter</display-name>
<filter-name>EncodingFilter</filter-name>
<filter-class>cn.itcast.web.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
不怕孤独,努力沉淀!