黑马程序员技术交流社区
标题: 【郑州校区】使用动态代理完成字符集编码过滤器的编写 [打印本页]
作者: 我是楠楠 时间: 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 |