struts2框架---------拦截器(Interceptor)

来源:互联网 发布:医学人工智能联盟 编辑:程序博客网 时间:2024/05/07 18:34
拦截器和拦截器栈
拦截器(Interceptor)是用来动态拦截请求的Action 对象。它提供了一种机制使开发者可以定义在一个动作执行的前后执行的代码,也可以在一个action 执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。拦截本质上是AOP的一种实现策略
拦截器链(Interceptor Chain,在Struts 2 中称

为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一根链条。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序依次被调用


拦截器链调用时序图



Struts2拦截器(Interceptor)
Struts2的拦截器和Servlet过滤器类似。在执行Action的execute 方法之前,Struts2会首先执行在struts.xml 中要请求的Action所引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute 方法。
Struts2拦截器类必须实现com.opensymphony.xwork2.interceptor.Interceptor接口

使用预定义的拦截器
在Struts2 中已经在struts-default.xml中预定义了一些自带的通用拦截器。
要使用这些拦截器,需要在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。

Struts2拦截器—Interceptor接口
在Intercepter接口中有如下三个方法需要实现:
voiddestroy();
voidinit();
Stringintercept(ActionInvocation invocation) throws Exception;
其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。

自定义拦截器
实现一个拦截器非常简单。实际上,一个拦截器就是一个普通的类,只是这个类必须实现

  com.opensymphony.xwork2.interceptor.Interceptor接口(init,destroy,intercept)或继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类

其中init和destroy方法只在拦截器加载和释放(都由Struts2自身处理)时执行一次。而
intercept方法在每次访问动作时都会被调用。
intercept其中里边有一个类型为ActionInvocation的参数,代表当前请求Action的调度者。该参数会持有对应Action和相关所有Interceptor的实例

自定义拦截器配置struts.xml
定义在package的最前面

<interceptors>

<interceptor name="first"class="interceptor.FirstInterceptor"></interceptor>

</interceptors>

Action节点引用:其中的name就是前面定义的拦截器或拦截器栈的名字
<interceptor-refname="first"></interceptor-ref>

拦截器栈(Interceptor Stack)的配置
对于多个拦截器,可以把它们放在一个拦截器栈里面,像过滤器链一样让它们顺序执行
同样在struts.xml里配置:

<interceptor name="first" class="interceptor.FirstInterceptor"></interceptor>

<interceptor-stack name="myStack">

<interceptor-refname="first" />

<interceptor-refname="defaultStack" />

</interceptor-stack>

拦截器和拦截器栈是一个级别的,也就是说一个拦截器栈中可以包括许多拦截器, 也可以包括其他拦截器栈。 interceptor-ref 既可以引用一个具体的拦截器,也可以引用一个拦截器栈
如果拦截器栈中有多个拦截器,在执行action之前的顺序跟配置拦截器的顺序一致,而在action之后执行的顺序是相反的;

默认拦截器栈
struts2中有一个系统默认的拦截器栈是 defaultStack,如果你手动引用自己的拦截器,系统默认的拦截器栈将不起作用;这样必需显式引入系统的拦截器栈<interceptor-ref name=“defaultStack”/>
也可以改变系统默认的拦截器栈,可以这样配置:<default-interceptor-ref name=“myStack”/>
每个包只能有一个默认拦截器

方法过滤拦截器
默认配置的拦截器都要是针对整个action的,
如果需要针对某个方法进行拦截可以继承MethodFilterInterceptor类;
它的使用跟上边的使用方法差不多,只是需要要配置它对那个方法进行拦截,如下:

<interceptor-refname="myInterceptor3">

              <param name="includeMethods">method1,method2</param>

              <param name="excludeMethods">execute</param>

   </interceptor-ref>

其中includeMethods ,excludeMethods是关键字

 includeMethods 表示包含拦截那些方法,多个方法需要用”,”隔开; excludeMehtods是排除拦截的那些方法;


0 0
原创粉丝点击