struts2中的拦截器详解。
一.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的功能。