黑马程序员技术交流社区

标题: 用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题 [打印本页]

作者: denxinzlz610    时间: 2016-9-6 20:06
标题: 用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题
有四种方式,

  1、继承 :(下下策)
      ①明确知道全类名
        可以打印request实现类,可以知道实现类的全类名

      ②就是可以在子类中 new 父类
        你能确定request实现类,一定可以new么?

        确定自己写出的是通用方法。tomcat,weblogic,jboss......


       缺点:
          ①很难实现,几乎没有扩展性
          ②会占用宝贵的extends位

  2、装饰设计模式【静态代理】
  优点:
       ①不用知道实现类,可以用接口。  代码扩展性极强
       ②不用占用宝贵的extends位


  步骤:
      ①增强类  必须实现  被增强类 实现的所有接口
      ②增强类  必须能够获得  被增强类  引用

  缺点:
    如果接口中的无关方法过多,浪费大量实现实现这些无关方法。

  解决方案:
    1、用动态代理
    2、去找包装类,只需要继承包装类,子包装/子增强类
    HttpServletRequestWrapper

  3、动态代理(暂时先不说)
  4、字节码增强(暂时先不说)



具体代码实现:

  

  解决方式:使用装饰者设计模式(静态代理)对getParameter进行功能增强







  1、自己的类继承HttpServletRequestWrapper,对其中的getParameter方法进行重写




1、自己写的增强类



  


1 package com.itheim.utils;
2 import java.io.UnsupportedEncodingException;
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletRequestWrapper;
5 public class MyHttpRequest extends HttpServletRequestWrapper {
6     HttpServletRequest req;
7     public MyHttpRequest(HttpServletRequest old) {
8         super(old);
9         // TODO Auto-generated constructor stub
10         this.req=old;
11     }
12     @Override
13     public String getParameter(String name) {
14         String method = req.getMethod();
15         if("get".equalsIgnoreCase(method)){
16             String par = req.getParameter(name);
17             if(par!=null){
18                 String result = null;
19                 try {
20                     result=new String(par.getBytes("iso8859-1"), "utf-8");
21                 } catch (UnsupportedEncodingException e) {
22                     // TODO Auto-generated catch block
23                     throw new RuntimeException(e);
24                 }
25                 return result;
26             }
27            
28         }
29         
30         return req.getParameter(name);
31     }
32 }


2、过滤器中的代码实现



1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
2         //解决post乱码
3         request.setCharacterEncoding("utf-8");
4         //解决get乱码
5         HttpServletRequest httpServletRequest=(HttpServletRequest) request;
6         MyHttpRequest request2=new MyHttpRequest(httpServletRequest);
7         chain.doFilter(request2, response);
8     }





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2