动态代理练习1-全站字符编码过滤[request动态代理]

1、全站字符编码过滤[request动态代理]

  a)使用装饰设计模式

  b)使用动态代理

 

开发步骤:

1)写一个普通类,无需任何继承或实现
2)写一个实例变量,记住代理谁,即目标对象
3)使用构造方法为实例变量赋值
4)写一个普通方法,该方法的返回值是接口,该接口是目标对象的实现接口

a)普通类-即代理类

 1 import java.io.IOException;
 2 import java.lang.reflect.InvocationHandler;
 3 import java.lang.reflect.Method;
 4 import java.lang.reflect.Proxy;
 5 
 6 import javax.servlet.Filter;
 7 import javax.servlet.FilterChain;
 8 import javax.servlet.FilterConfig;
 9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 //    过滤器
15 public class EncodingFilter implements Filter {
16     
17     public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {
18         
19         HttpServletRequest request = (HttpServletRequest) req;
20         HttpServletResponse response = (HttpServletResponse) res;
21         MyRequest myRequest = new MyRequest(request);
22         chain.doFilter(myRequest.getProxy(),response);
23     }
24     public void init(FilterConfig filterConfig) throws ServletException {
25     }
26     public void destroy() {
27     }
28 }
29 //使用动态代理方式产生代理对象
30 class MyRequest{ //1、写一个普通类,无需任何继承或实现
31     private HttpServletRequest request;//2、代理谁,代理HttpServletRequest,写一个实例变量,记住代理谁,即目标对象
32     public MyRequest(HttpServletRequest request){//3、使用构造方法为实例变量赋值
33         this.request = request;
34     }
35     public HttpServletRequest getProxy(){//4、写一个普通方法,该方法的返回值是接口,该接口是目标对象的实现接口,即HttpServletRequest
36         return (HttpServletRequest) Proxy.newProxyInstance(
37                 MyRequest.class.getClassLoader(), 
38                 request.getClass().getInterfaces(),
39                 new InvocationHandler(){
40                     public Object invoke(
41                             Object proxy, 
42                             Method method,
43                             Object[] args) throws Throwable {
44                         if("getParameter".equals(method.getName())){
45                             //取得请求的类型[POST或GET]
46                             String m = request.getMethod();
47                             //如果是GET请求类型
48                             if("get".equalsIgnoreCase(m)){
49                                 String value = request.getParameter((String)args[0]);//乱码
50                                 byte[] buf = value.getBytes("ISO8859-1");
51                                 value = new String(buf,"UTF-8");//正码
52                                 return value;    
53                             }else if("post".equalsIgnoreCase(m)){
54                                 request.setCharacterEncoding("UTF-8");
55                                 String value = request.getParameter((String)args[0]);//正码
56                                 return value;
57                             }
58                         }else{
59                             //放行
60                             return method.invoke(request,args);
61                         }
62                         return null;
63                     }
64                 });
65     }
66 }

 

  b)Servlet-即被代理的类

 1 import java.io.IOException;
 2 import javax.servlet.ServletException;
 3 import javax.servlet.http.HttpServlet;
 4 import javax.servlet.http.HttpServletRequest;
 5 import javax.servlet.http.HttpServletResponse;
 6 
 7 public class GetPostSetvlet extends HttpServlet {
 8 
 9     public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
10         request.setCharacterEncoding("utf-8");
11         String method = request.getMethod();
12         String username = request.getParameter("username");
13         System.out.println("用户名["+method+"]:"+username);
14         
15     }
16     public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
17         this.doGet(request, response);
18     }
19 }

  c)jsp页面

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html>
3   <body>
4       <form action="${pageContext.request.contextPath}/GetPostSetvlet"  method="post">
5           <input type="text"  name="username"/>
6           <input type="submit"  value="登录"/>
7       </form>
8   </body>
9 </html>

 

  d)web.xml配置

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7     <filter>
 8         <filter-name>EncodingFilter</filter-name>
 9         <filter-class>cn.zengfanshegn.proxy.servlet.EncodingFilter</filter-class>
10     </filter>
11     <filter-mapping>
12         <filter-name>EncodingFilter</filter-name>
13         <servlet-name>GetPostSetvlet</servlet-name>
14     </filter-mapping>
15     
16     <servlet>
17         <servlet-name>GetPostSetvlet</servlet-name>
18         <servlet-class>cn.zengfanshegn.proxy.servlet.GetPostSetvlet</servlet-class>
19     </servlet>
20   <servlet-mapping>
21         <servlet-name>GetPostSetvlet</servlet-name>
22         <url-pattern>/GetPostSetvlet</url-pattern>
23     </servlet-mapping>
24 </web-app>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值