首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

struts2自个儿定义拦截器

2012-09-19 
struts2自己定义拦截器Interceptor(拦截器),顾名思义,就是在某个事件发生之前进行拦截,并插入某些处理过程

struts2自己定义拦截器
Interceptor(拦截器),顾名思义,就是在某个事件发生之前进行拦截,并插入某些处理
过程。Servlet 2.3规范中引入的Filter 算是拦截器的一个典型实现,它在Servlet执行之前被触发,对输入参数进行处理之后,再将工作流程传递给对应的Servlet。
而今年来兴起的AOP(Aspect Oriented Programming),更是将Interceptor 的作用提升到
前所未有的高度。
Xwork 的Interceptor 概念与之类似。即通过拦截Action 的调用过程,为其追加预处理
和后处理过程。

自定义一个拦截器需要三步:

1.自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。 Struts2提供MethodFilterInterceptor类,该类是AbstractInerceptor的子类,可以实现对Action方法的拦截.
  1.1 Interceptor接口声明了三个方法:
      public interface Interceptor extends Serializable {
           void destroy();
           void init();
           String intercept(ActionInvocation invocation) throws Exception;
      }
      Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-  constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。
      Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。
      Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用 invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。
  1.2 AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:
      public abstract class AbstractInterceptor implements Interceptor {
          public void init() {}
          public void destroy() {}
          public abstract String intercept(ActionInvocation invocation) throws Exception;
      }
      在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。
  1.3 MethodFilterInterceptor中有两个方法  
      setExcludeMethods:排除需要过滤的方法     
      setIncludeMethods:设置需要过滤的方法     
      如果一个方法同时在excludeMethods和includeMethods中出现,则会被拦截

2.在strutx.xml中注册上一步中定义的拦截器。
3.在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。
4.<default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦截器堆栈)
5.Interceptor拦截类型
  5.1 before拦截,是指在拦截器中定义的代码,它们存在于invocation.invoke()代码执行之前。这些代码,将依照拦截器定义的顺序,顺序执行。
  5.2 after拦截,是指在拦截器中定义的代码,它们存在于invocation.invoke()代码执行之后。这些代码,将一招拦截器定义的顺序,逆序执行。
  5.3 PreResultListener拦截: 有的时候,before拦截和after拦截对我们来说是不够的,因为我们需要在Action执行完之后,但是还没有回到视图层之前,做一些事情。Struts2同样支持这样的拦截,这种拦截方式,是通过在拦截器中注册一个PreResultListener的接口来实现的。

热点排行