`
dazheng1024
  • 浏览: 13700 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

struts2 拦截器

 
阅读更多

java拦截器的基本原理其实非常简单,说白了就是动态代理类。
下面来看一个简单的例子
首先,我建立一个拦截器的类InterceptorClass,这里的before()和after()方法是以后拦截器会执行的方法
CODE清单一:

public   class  InterceptorClass  {
 
public   void  before()
  System.out.println(
" 拦截器InterceptorClass方法调用:before()! " ); 
 }
 
 
public   void  after()
     System.out.println(
" 拦截器InterceptorClass方法调用:after()! " ); 
 }

}

 

我们模拟一个业务组件接口BusinessInterface,和一个业务组件实现类BusinessClass
CODE清单二:

public   interface  BusinessInterface  {
 
public   void  doSomething();
}

 

CODE清单三:

public   class  BusinessClass  implements  BusinessInterface  {
 
public   void  doSomething()  {
   System.out.println(
" 业务组件BusinessClass方法调用:doSomething() " ); 
 }

}

 

然后,创建一个动态代理类DynamicProxyHandler,这个类是集成InvocationHandler接口的,动态类的原理实际上是使得当你执行一个动态方

法的时候,他可以把这个动态方法dispatch到这个动态类上来。这样,你就可以在这个方法的前后嵌入自己的一些方法。
CODE清单四:
//包含了业务对象绑定动态代理类的处理,并实现了InvocationHandler接口的invoke方法

public   class  DynamicProxyHandler  implements  InvocationHandler  {
 
private  Object business; // 被代理对象
  private  InterceptorClass inceptor  =   new  InterceptorClass(); // 拦截器
 
 
//  动态生成一个代理类对象,并绑定被代理类和代理处理器
  public  Object bind(Object business)  {
   
this .business  =  business;
   
return  Proxy.newProxyInstance(
     
// 被代理类的ClassLoader
     business.getClass().getClassLoader(),
     
// 要被代理的接口,本方法返回对象会自动声称实现了这些接口
     business.getClass().getInterfaces(), 
     
// 代理处理器对象
      this );
 }


 
 // 代理要调用的方法,并在方法调用前后调用连接器的方法

  /** */ /**
  * 
@param  proxy  代理类对象
  * 
@param  method 被代理的接口方法
  * 
@param  args   被代理接口方法的参数
  * 
@throws  Throwable
  
*/

 
public  Object invoke(Object proxy, Method method, Object[] args)
   
throws  Throwable  {
  Object result 
=   null ;
  inceptor.before();
  result
= method.invoke(business,args);
  inceptor.after();
  
return  result;
 }


OK,我们来写个类测试一下
CODE清单五:

public   static   void  main(String[] args)  {
  
// 生成动态代理类实例
  DynamicProxyHandler handler  =   new  DynamicProxyHandler();
  
// 生成待测试的业务组件对象
        BusinessInterface business  =   new  BusinessClass();
        
// 将业务组件对象和动态代理类实例绑定
        BusinessInterface businessProxy  =  (BusinessInterface) handler.bind(business);
        
// 用动态代理类调用方法
        businessProxy.doSomething();
 }


来看看结果:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics