这里借助过滤器来实现一个过滤全站资源的功能
- 第一步要在web.xml中配置一点小东东:
<filter>
<filter-name>AllCharacterEncodingFilter</filter-name>
<filter-class>cn.filter.AllCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AllCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.写filter类:
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
public class AllCharacterEncodingFilter implements Filter {
private FilterConfig filterConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse)resp;
HttpServletRequest request = (HttpServletRequest)req;
/*步骤:
1、获取配置的过滤器参数encoding的值:如果没有,给定一个默认值
2、设置POST请求方式的中文请求参数的编码
3、设置响应输出时的编码:字符流和字节流
4、字节流输出时通知客户端的解码码表
5、字节流输出时通知客户端的解码码表;字符流:字符流输出时使用的码表及通知客户端解码用的码表
6、最后别忘了放行*/
String encoding = filterConfig.getInitParameter("encoding");
if(encoding==null)
encoding="UTF-8";
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
response.setContentType("text/html;character="+encoding);
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
//HttpServletRequestWrapper是一个实现了HttpServletRequest接口的包装器类
class MyHttpServletRequest extends HttpServletRequestWrapper{
public MyHttpServletRequest(HttpServletRequest request){
super(request);
}
//这里只对get请求方式进行改写
public String getParameter(String name){
String value = super.getParameter(name);
if(value==null)
return value;
//得到请求方式
String method = super.getMethod();
if("get".equalsIgnoreCase(method)){
try {
value = new String(value.getBytes("ISO-8859-1"),super.getCharacterEncoding());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return value;
}
}
3.小结:
- 包装设计模式的两种编码步骤:
-
第一种情况
- 被包装类有实现的接口的情况
- 1、编写一个类,实现与包装器类相同的接口
- 2、定义一个变量,记住被包装器对象的引用
- 3、定义构造方法,注入被包装对象的引用
- 4、对于要改写的方法,写你的代码
- 5、对于不需要改写的方法,调用原有对象的对应方法
-
第二种情况
- 被包装类没有实现接口的情况(上面例子中的MyHttpServletRequest类就属于此种情况)
- 1、编写一个类,继承被包装类
- 2、定义一个变量,记住被包装对象的引用
- 3、定义构造方法,注入被包装对象的引用
- 4、对于要改写的二分法,写你的代码
-
第一种情况