使用动态代理完成字符集编码过滤器的编写

1.1.1  需求:
无论使用GET还是POST提交,到Servlet中只需要调用request.getParameter方法,中文乱码就已经处理好。
1.1.2  分析: 1.1.2.1  技术分析:
【要求中的方法的增强】
Ø继承:能够控制这个类的构造。
Ø装饰者:增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用。
*接口中方法过多,只增强其中的某个方法。其他的方法也需要重写。
Ø  动态代理:被增强的类实现了接口。
【代理的概述】
Ø代理:
ØJDK中动态代理:代理对象。
* Proxy.newProxyInstance(ClassLoader cl,Class []接口,InvocationHandler  ih);
【动态代理入门】:
1.1.3  代码实现:
[AppleScript的]  纯字幕:查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
@WebFilter ( urlPatterns = "/*" )
 
public class GenericEncodingFilter implements Filter {
 
  
 
@Override
 
public void init ( FilterConfig filterConfig ) throws ServletException {
 
  
 
}
 
  
 
@Override
 
public void doFilter ( ServletRequest request , ServletResponse response , FilterChain chain )
 
throws IOException , ServletException {
 
final HttpServletRequest req = ( HttpServletRequest ) request;
 
/ / 增强req :
 
HttpServletRequest myReq = ( HttpServletRequest ) Proxy.newProxyInstance ( req.getClass ( ) .getClassLoader ( ) ,
 
req.getClass ( ) .getInterfaces ( ) , new InvocationHandler ( ) {
 
 
@Override
 
public Object invoke ( Object proxy , Method method , Object[] args ) throws Throwable {
 
/ / 判断执行的方法是否是getParameter :
 
if ( "getParameter" . equals ( method.getName ( ) ) ) {
 
/ / 调用的是getParameter : 需要增强这个方法.
 
/ / 判断请求方式是GET还是POST :
 
String type = req.getMethod ( ) ;
 
if ( "get" .equalsIgnoreCase ( type ) ) {
 
String value = ( String ) method.invoke ( req , args ) ;
 
value = new String ( value .getBytes ( "ISO-8859-1" ) , "UTF-8" ) ;
 
return value ;
 
} else if ( "post" .equalsIgnoreCase ( type ) ) {
 
req.setCharacterEncoding ( "UTF-8" ) ;
 
}
 
}
 
return method.invoke ( req , args ) ;
 
}
 
} ) ;
 
 
chain.doFilter ( myReq , response ) ;
 
}
 
  
 
@Override
 
public void destroy ( ) {
 
  
 
}
 
  
 
}
1.1.4  总结: 1.1.4.1  代理的企业应用:
【春天的AOP】
AOP的底层使用的就是代理机制:
* AOP:面向切面编程。新的思想,用来解决OOP中遇到的一些问题!
1.1.4.2  类加载器:
类的加载器:将类文件加载到JVM中执行这个文件。
Java的中将类加载器分成三类:
引导类加载器:                JAVA_HOME/jre/lib/rt.jar
     |
扩展类加载器:                JAVA_HOME/jre/lib/ext/*.jar
     |
应用类加载器:                加载类路径下的所有的class.
这些类加载器如何保证类只会加载一次而且不会重复加载:
类加载器的全盘委托机制:
class A {
String s;
}
由应用类加载器得到A.class String,class,委托给扩展类加载器,扩展类加载器又委托给引导类加载器.引导类加载器加载String.class.将其他的类的class向下给扩展类加载器.扩展类加载器没有找到.向下给应用类加载器,将A.class 加载.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值