黑马程序员技术交流社区

标题: 【郑州校区】使用动态代理完成字符集编码过滤器的编写 [打印本页]

作者: 我是楠楠    时间: 2018-7-2 14:07
标题: 【郑州校区】使用动态代理完成字符集编码过滤器的编写
本帖最后由 我是楠楠 于 2018-7-4 17:26 编辑

【郑州校区】使用动态代理完成字符集编码过滤器的编写

1.1.1 需求:
无论 使用GET还是POST提交,到Servlet中只需要调用request.getParameter方法,中文乱码就已经处理好.
1.1.2 分析:1.1.2.1 技术分析:
【request中的方法的增强】
Ø 继承                :能够控制这个类的构造.
Ø 装饰者        :增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用.
* 接口中方法过多,只增强其中的某个方法.其他的方法也需要重写.
Ø 动态代理:被增强的类实现了接口.
【代理的概述】
Ø 代理                :
Ø JDK中动态代理        :Proxy对象.
* Proxy.newProxyInstance(ClassLoader cl,Class[] interfaces,InvocationHandler ih);
【动态代理入门】:
1.1.3 代码实现:
[AppleScript] 纯文本查看 复制代码
@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 代理的企业应用:
【Spring的AOP】
AOP的底层使用的就是代理机制:
* AOP        :面向切面编程.新的思想,用来解决OOP中遇到的一些问题!!!
1.1.4.2 类加载器:
类的加载器:将class文件加载到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 加载.
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出





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