说是struts2的核心就是拦截器
先看看拦截器的实现
实现拦截器有这么几个东西构成
1、目标对象-将被拦截的对象,这个对象中的方法被调用是将被拦截
要求目标对象面向接口编程,首先要定义接口package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:37:23
* 面向接口编程
* 目标对象的接口
*/
public interface TargetInterface {
public void doSomething();
}目标对象实现
package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:36:26
* 目标对象
*/
public class Target implements TargetInterface{
public void doSomething(){
System.out.println("do something");
}
}
2、拦截器对象-里面包含在调用目标对象前或后要调用的方法package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:39:32
* 拦截器
*/
public class Interceptor {
public void before(){
System.out.println("before");
}
public void after(){
System.out.println("after");
}
}
3、处理器-处理器决定拦截器如何拦截目标对象
package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:41:08
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 处理器
* 在这里将目标对象Target和拦截器Interceptor联系在了一起
*/
public class MyHandler implements InvocationHandler{
/**
* 目标对象
* 将来目标对象的方法将被注入interceptor
*/
private Object object;
/**
* 拦截器
* MyHandler负责将Interceptor这个拦截器注入到传入的目标对象object
*/
private Interceptor interceptor = new Interceptor();
public void setObject(Object object){
this.object = object;
}
/**
* 实现InvocationHandler接口的方法
* @param o 在其上调用方法的代理实例
* @param method 对应于在代理实例上调用的接口方法的 Method 实例
* @param objects 包含传入代理实例上方法调用的参数值的对象数组
* @return 从代理实例的方法调用返回的值
* @throws Throwable
*/
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
Object result = null;
interceptor.before();
result = method.invoke(object,objects);
interceptor.after();
return result;
}
}
4、代理对象-用于得到目标对象的代理对象
package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:50:52
* 代理类
*/
import java.lang.reflect.Proxy;
public class MyProxy {
/**
* 返回obj的,处理器为MyHandler的代理对象
* @param obj 目标对象
* @return 目标对象的代理对象
*/
public Object getProxy(Object obj){
MyHandler myHandler = new MyHandler();
myHandler.setObject(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),myHandler);
}
}
5、最后客户调用代码package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:55:45
* 客户调用
*/
public class Client {
public static void main(String[] args){
//目标对象
TargetInterface target = new Target();
//代理对象
MyProxy myProxy = new MyProxy();
//通过代理对象得到目标对象的代理
TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
//通过目标对象的代理调用目标对象的方法
proxy.doSomething();
}
}
//输出:
//before
//do something
//after
将自己的理解写了注释,现在只理解到这个程度,像
Proxy.newProxyInstance
里面是怎么实现的,还没深入考究
继续努力
没有评论:
发表评论