|
默认的拦截器栈设计用来服务于大多数应用程序.很多应用程序不需要添加拦截器或改变拦截器栈.
很多Action共享关联.一些Action需要输入验证.另一个Action可能需要一个预处理的文件上传.另一个Action可能需要保护来自一个double的提交.一些Action需要从列表中去除和页面驻留在页面显示前.
Struts Action框架使得很容易解分开决这些问使用“Interceptor”策略.当你请求一个资源,它映射到一个”action”,框架调用Action对象.但是在Action执行前,调用可以被拦截通过另一个对象.在Action执行后,调用可以再次的被拦截.我们称这些对象为”Interceptors”(拦截器)
Understanding Interceptors(理解拦截器)
拦截器可以执行代码在Action执行前后.很多框架核心功能是实现拦截.此特征有点像重复提交的保护,类型转换,对象驻留,验证,文件上传,页在预处理,和更多.所有的准备都是在拦截器的帮助下完成.每个拦截器就像是一个插件,所以你可以决定精确的特性,那个Action需要被支持.
拦截器可以被配置基于独立的Action.你可以自定义拦截器混合和匹配拦截器同框架绑定.拦截器”set the stage(设置阶段)”为Action类.做很多重量级事情在Action执行前.
Action的生命周期
在一些情况下,一个拦截器将保持Action被激活,因为一个重复提交或验证失败.拦截器也可以改变Action执行前的状态.
拦截器定义在一个栈中指定执行的顺序.在一些情况下,拦截器在栈中的顺序是非常重要的.
Configuring Interceptors(配置拦截器)
Struts.xml
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="timer" class=".."/>
<interceptor name="logger" class=".."/>
</interceptors>
<action name="login"
class="tutorial.Login">
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
<result name="input">login.jsp</result>
<result name="success"
type="redirect-action">/secure/home</result>
</action>
</package>
查看struts-default.xml,我们可以看它是如何做的.
The Default Configuration(默认的配置)
struts-default.xml (struts2-core-2.X.X.jar根目录)
因为struts-default.xml包含了应用程序的默认配置,所有的预先定义拦截器和栈可用”out of the box”.
Framework Interceptors(框架的拦截器)
拦截器类也是使用键值对定义在指定的Struts配置文件中.名字指定在struts-default.xml文件中.如果你继承了struts-defaut包,这样你可以使用名字了.否则,他们必需定义在你的包中使用name-class对指定在<interceptors>标签.
一个抽像的拦截器被应用,选择相应included/exclude方法列表.
指下如下参数:
.execludeMethods-方法名被排除
.includeMethods-方法名被包含
注意:如果方法名可用在IncludeMethods和excludeMethods,它将被考虑为一个included方法.总之,includeMethods优于excludeMethods.
扩展拦截器的这个能力将是:
* TokenInterceptor
* TokenSessionStoreInterceptor
* DefaultWorkflowInterceptor
* ValidationInterceptor
Interceptor Parameter Overriding(拦截器参数覆盖)
拦截器的参数可以被覆盖通过下面的方式:
方法1:
<action name="myAction" class="myActionClass">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="params"/>
<interceptor-ref name="servlet-config"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="model-driven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="static-params"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">myValidationExcudeMethod</param>
</interceptor-ref>
<interceptor-ref name="workflow">
&l