struts2中的拦截器详解。

来源:互联网 发布:fliqlo mac 编辑:程序博客网 时间:2024/06/05 15:46

一.struts2中的拦截器简介

拦截器是在某个方法或者字段被访问之前进行拦截,然后在之前或者之后加入某些操作的手段。拦截器的方法大多数通过代理来实现,struts2中的拦截器实现比较简单,当请求到达strut2的servletdispatcher时,struts2会查找配置文件,并根据配置文件实例化相对的拦截器对象,然后串成一个列表,最后一个一个调用列表中的拦截器。struts2提供了很多内置的拦截,大多数情况都能满足需求,当开发者有特殊需求时,可自定义拦截器。

二.struts2中自定义拦截器的三种方式

自定义拦截器需要直接或者间接实现Interceptor类。该类定义为。

public interface Interceptor extends Serializable{void init();void destroy();String interceptor (ActionInvocation invocation)throw Exception; }

其中,init()方法在拦截器创建时就被调用,在拦截器整个生命周期中只被调用一次,可用来对相关资源做初始化。

destroy()方法,在拦截器实例被销毁之前,用来对拦截器相关的资源进行释放,也只被执行一次。

interceptor()方法,是拦截器的核心方法,用来实现具体的拦截操作。返回字符用来跳转到相应的视图页面,

其中,ActionInvocation参数中包含被拦截的action的引用,可以通过该参数的invoke()方法转给下一个拦

截器或者转到action的execute()方法;

自定义拦截器方法一

直接实现interceptor,在自定义拦截器中实现拦截器接口定义的方法。

自定义拦截器方法二

继承AbstractInterceptor,该抽象类的具体实现如下。

public abstract class AbstractInterceptor implements Interceptor{void init(){};void destroy(){};String interceptor (ActionInvocation invocation)throw Exception; }
由此可见,AbstractInterceptor类已经对Interceptor接口进行了空实现,自定义拦截器只需要实现interceptor方法即可,

在需要打开系统资源时,才覆盖init()和destroy()。

自定义拦截器方法三

实现过滤方法的拦截器MethodFilterInterceptor,此拦截器继承了AbstractInterceptor ,是一个拦截某一个具体的方法的方法过滤拦截器,并且,已经自动实现好了Intercept()方法 ,因此,我们想要拦截某一个方法的时候,只要继承MethodFilterInterceptor类,然后实现doIntercept()就可以 。实例如下。

public class MyInterceptor extends MethodFilterInterceptor {      @Override      protected String doIntercept(ActionInvocation invocation) throws Exception {          System.out.println("------MyInterceptor invoked begin------");            String result = invocation.invoke();          System.out.println("------MyInterceptor invoked finish------");           return result;      }  }  

三.自定义拦截器的配置。

拦截器的配置在strut.xml中完成,使用标签<interceptors>

步骤一:注册拦截器。

注册拦截器用<interceptor>标签。语法格式如下。

name属性用来指定拦截器的名字,class属性用来指定拦截器的实现类,<param>用来传入参数。

步骤二:配置拦截器栈

在实际开发中,需要在action执行前后同时执行多个拦截动作,此时可把多个拦截器组成一个拦截器栈。

定义拦截器栈使用<interceptor-stack>,当配置多个拦截器,使用<interceptor-ref>来指定多个拦截器,

语法格式如下。

小结,以上两步的配置可以总结为下图所示。

以上配置中,定义的拦截器栈是myStack,除了引进两个自定义的拦截器interpretor1和interpretor2外,

还引用了一个内置的拦截器栈defaultStack,并且,这个拦截器必须要引入。

步骤三:定制拦截方法

在拦截器栈配置时,定制方法的拦截,使用标签<param>,语法实例如下。

<interceptor-ref name=“InterceptorName"><!-- 指定哪些方法不拦截 <param name="excludeMethods">add,delete</param> --> <!-- 指定哪些方法需要拦截 --> <param name="includeMethods">add,delete</param></interceptor-ref>

步骤四:指定包中默认拦截器栈

使用标签<default-interceptor-ref>,为包指定默认的拦截器。语法格式如下。

<default-interceptor-ref name="myStack"></default-interceptor-ref>
还可以为单独的action指定拦截器,使用标签<interceptor-ref>,语法格式如下。
<interceptor-ref name="myStack"></interceptor-ref>

四.总结

拦截器是实现struts2的基础,熟悉掌握自定义拦截器能够更好的发挥strut2的功能。

原创粉丝点击