Struts 2的拦截器
2011-02-12 17:55
260 查看
1.拦截器的意义
避免重复代码调用DRY规则即Don’tReapeatYourself,即不重复编写你的代码,Struts2中的拦截器符合DRY规则。从代码角度来看,拦截器本质就是一个JAVA类,这个类的某些方法较特殊,框架执行目标方法调用之前首先执行拦截器中的这些特殊方法。使用了拦截器可避免在代码中手工调用这些方法。
实现高层次的代码解耦
目标代码无需手动调用目标方法,而是由框架完成,从而将这种调用代码层次上升到更高层次,提供更高层次的解耦。
2.Struts2内建拦截器
Strus2框架内建了大量的拦截器完成了框架几乎70%的工作,比如,params拦截器将HTTP请求中的参数解析出来,设置成Action的属性;servlet-config拦截器直接将HTTP请求中的HttpServletRequest实例和HttpServletResponse实例传给Action;fileUpload拦截器负责解析请求参数中的文件域,并将一个文件域设置成Action的3个属性...由于默认的struts拦截器栈中定义了许多框架的常用操作,且若Action中使用了自定义拦截器,struts-default包中定义的defaultStack将不起作用,从而无法完成HTTP参数映射到Action各属性的过程,因此大部分情况下,为某个Action指定了相应的拦截器后,组合使用多个拦截器/拦截器栈,或者自定义一个拦截器栈,其中包含对defaultStack的引用。
3.拦截器的实现原理
定义接口定义接口实现类
系统拦截器类
上面只是些普通的JAVA类,实现拦截器功能关键是下面的代理类
privateObjecttarget;//需被代理的目标对象
//创建拦截器实例
DogIntercepterdi=newDogIntercepter();
//执行代理的目标方法时,该Invoke方法会被自动调用
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args){
Objectresult=null;
if(method.getName().equals("info"){
di.methord1();
result=method.invoke(tart,args);
di.method2();
}
else{
result=methos.invoke(target,args);
}
returnresult;
}
publicvoidsetTarget(Objecto){
this.target=o;
}
}
代理工厂类
publicstaticObjectgetProxy(Objectobject){
ProxyHandlerhandler=newProxyHandler();
handler.setTarget(object);
returnProxy.newProxyInstance(Dogimpl.class.getClassLoader(),
object.getClass().getInterfaces(),handler);
}
}
主程序
publicstaticvoidmain(String[]args){
DogtargetObject=newDogImpl();
Dogdog=null;
//以目标对象创建代理
Objectproxy=MyProxyFactory.getProxy(targetObject);
if(proxyinstanceofDog){
dog=(Dog)proxy;
}
dog.info();
dog.run();
}
}