包装设计模式解决JavaWeb开发中全站中文乱码问题

时间:2021-11-14 13:20:11

这里借助过滤器来实现一个过滤全站资源的功能

  1. 第一步要在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、对于要改写的二分法,写你的代码