一.动态代理入门案例:
Waiter接口:
package dynamicProxy;
public interface Waiter {
public void server();
public String sayHello(String name);
}
Waitess实现类:
package dynamicProxy;
public class Waitess implements Waiter {
@Override
public void server() {
System.out.println("服务中...");
}
@Override
public String sayHello(String name) {
return "Hello:"+name;
}
}
ProxyDemo1:
package dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.junit.Test;
public class ProxyDemo1 {
@Test
public void demo1() {
Waiter waiter1 = new Waitess();
ClassLoader loader = waiter1.getClass().getClassLoader();
Class[] interfaces = waiter1.getClass().getInterfaces();
Waiter waiter = (Waiter) Proxy.newProxyInstance(loader, interfaces, new MyInvocationHandler(waiter1));
waiter.server();
String s = waiter.sayHello("张三");
System.out.println(s);
}
}
class MyInvocationHandler implements InvocationHandler {
private Waiter waiter;
public MyInvocationHandler(Waiter waiter) {
this.waiter = waiter;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("server".equals(method.getName())) {
System.out.println("This is server:");
Object obj = method.invoke(waiter, args);
return obj;
} else {
System.out.println("This is sayHello:");
Object obj = method.invoke(waiter, args);
return obj;
}
}
}
二.动态代理完成字符集编码过滤器的编写:
GenericEncodingServlet:
public class GenericEncodingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username1 = request.getParameter("username1");
System.out.println("Get方式的中文:"+username1);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username2 = request.getParameter("username2");
System.out.println("Post方式的中文:"+username2);
}
}
GenericEncodingFilter:
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
ClassLoader loader = req.getClass().getClassLoader();
Class[] interfaces = req.getClass().getInterfaces();
HttpServletRequest newReq = (HttpServletRequest) Proxy.newProxyInstance(loader, interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("getParameter".equals(method.getName())) {
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");
System.out.println("get");
return value;
} else if ("post".equalsIgnoreCase(type)) {
System.out.println("post");
req.setCharacterEncoding("UTF-8");
}
}
return method.invoke(req, args);
}
});
chain.doFilter(newReq, response);
}
encoding.jsp
<body>
<form action="/Web16/GenericEncodingServlet" method="get">
Get方式:<input type="text" name="username1">
<input type="submit" value="提交">
</form>
<form action="/Web16/GenericEncodingServlet" method="Post">
Post方式:<input type="text" name="username2">
<input type="submit" value="提交">
</form>
</body>