本帖最后由 我是楠楠 于 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口出 |