动态代理练习1-全站字符编码过滤[request动态代理]
2013-05-01 16:36
429 查看
1、全站字符编码过滤[request动态代理]
a)使用装饰设计模式
b)使用动态代理
开发步骤:
1)写一个普通类,无需任何继承或实现
2)写一个实例变量,记住代理谁,即目标对象
3)使用构造方法为实例变量赋值
4)写一个普通方法,该方法的返回值是接口,该接口是目标对象的实现接口
a)普通类-即代理类
b)Servlet-即被代理的类
c)jsp页面
d)web.xml配置
a)使用装饰设计模式
b)使用动态代理
开发步骤:
1)写一个普通类,无需任何继承或实现
2)写一个实例变量,记住代理谁,即目标对象
3)使用构造方法为实例变量赋值
4)写一个普通方法,该方法的返回值是接口,该接口是目标对象的实现接口
a)普通类-即代理类
import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // 过滤器 public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; MyRequest myRequest = new MyRequest(request); chain.doFilter(myRequest.getProxy(),response); } public void init(FilterConfig filterConfig) throws ServletException { } public void destroy() { } } //使用动态代理方式产生代理对象 class MyRequest{ //1、写一个普通类,无需任何继承或实现 private HttpServletRequest request;//2、代理谁,代理HttpServletRequest,写一个实例变量,记住代理谁,即目标对象 public MyRequest(HttpServletRequest request){//3、使用构造方法为实例变量赋值 this.request = request; } public HttpServletRequest getProxy(){//4、写一个普通方法,该方法的返回值是接口,该接口是目标对象的实现接口,即HttpServletRequest return (HttpServletRequest) Proxy.newProxyInstance( MyRequest.class.getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler(){ public Object invoke( Object proxy, Method method, Object[] args) throws Throwable { if("getParameter".equals(method.getName())){ //取得请求的类型[POST或GET] String m = request.getMethod(); //如果是GET请求类型 if("get".equalsIgnoreCase(m)){ String value = request.getParameter((String)args[0]);//乱码 byte[] buf = value.getBytes("ISO8859-1"); value = new String(buf,"UTF-8");//正码 return value; }else if("post".equalsIgnoreCase(m)){ request.setCharacterEncoding("UTF-8"); String value = request.getParameter((String)args[0]);//正码 return value; } }else{ //放行 return method.invoke(request,args); } return null; } }); } }
b)Servlet-即被代理的类
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GetPostSetvlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { request.setCharacterEncoding("utf-8"); String method = request.getMethod(); String username = request.getParameter("username"); System.out.println("用户名["+method+"]:"+username); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { this.doGet(request, response); } }
c)jsp页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <form action="${pageContext.request.contextPath}/GetPostSetvlet" method="post"> <input type="text" name="username"/> <input type="submit" value="登录"/> </form> </body> </html>
d)web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>cn.zengfanshegn.proxy.servlet.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <servlet-name>GetPostSetvlet</servlet-name> </filter-mapping> <servlet> <servlet-name>GetPostSetvlet</servlet-name> <servlet-class>cn.zengfanshegn.proxy.servlet.GetPostSetvlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>GetPostSetvlet</servlet-name> <url-pattern>/GetPostSetvlet</url-pattern> </servlet-mapping> </web-app>
相关文章推荐
- 动态代理练习1-全站字符编码过滤[request动态代理]
- 动态代理练习2-全站压缩流输出[response动态代理]
- 动态代理练习2-全站压缩流输出[response动态代理]
- 动态代理AOP实现方法过滤
- 利用filter和动态代理解决全站乱码问题
- 过滤器-用动态代理解决全站乱码
- 【javaweb:Proxy&Filter】采用动态代理和过滤器解决request的全局乱码问题
- 动态代理练习3-自定义数据库连接池[connection动态代理]
- 过滤器-用动态代理解决全站乱码
- 动态代理练习3-自定义数据库连接池[connection动态代理]
- java 反射提取类信息, 动态代理 和过滤某些方法演示
- java 反射提取类信息, 动态代理 和过滤某些方法演示
- 使用动态代理实现对request和response的增强
- cglib动态代理介绍(一)
- Java动态代理简述
- Java动态代理之JDK
- Java动态代理和静态代理的区别
- Java JDK 动态代理(AOP)使用及实现原理分析
- 动态代理机制
- 【原创】Java动态代理总结