默认的拦截器栈能够满足大部分应用的需求。大部分应用没有必要添加拦截器或者改变既存的拦截器栈
很多action有共通的关注点。有些action需要对input进行check,有些action可能需要对文件上传进行预处理,有些action需要对多次提交进行保护,
很多action在页面显示之前,需要下拉列表和其他控件预填充。
struts2通过使用拦截器使得共享action关注点的解决方案变得容易。当url请求 一个已经map到action的资源时,框架会调用action类,但是在action被执行之前
调用会被另一个类拦截。Action执行之后,调用会被再次拦截。拦截类我们称之为拦截器
拦截器的理解
在一些情况下,因为多次提交或者验证失败,所以一个拦截器可能需要保持一个action不断执行。拦截器也能够在action执行之前,改变action的状态
自定义struts.xml
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="timer" class=".."/>
<interceptor name="logger" class=".."/>
<interceptor-stack name="myStack">
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
</interceptor-stack>
</interceptors>
<action name="login"
class="tutuorial.Login">
<interceptor-ref name="myStack"/>
<result name="input">login.jsp</result>
<result name="success"
type="redirectAction">/secure/home</result>
</action>
</package>
方法过滤
MethodFilterInterceptor是一个抽象拦截器,可以作为一个自定义具体拦截器的基类。而这个具体拦截器可以根据列出的action的方法名字进行有选择的拦截执行。
默认情况下会拦截action中所有的方法
过滤器包含了两种参数:
excludeMethods:指定的action方法都不会被拦截
includeMethods:指定的action方法都会拦截
说明:如果一个方法名字在两个地方都存在,则会被认为是include的方法
扩展了此能力的拦截器有:
TokenInterceptor
TokenSessionStoreInterceptor
DefaultWorkflowInterceptor
ValidationInterceptor
拦截器参数重载(主要是对默认struts配置文件里面的配置进行重载)
拦截器的参数可以用一下几种方式重载
方法一:
<action name="myAction" class="myActionClass">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="params"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name=" excludeMethods">myValidationExcudeMethod</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name=" excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>
</action>
方法二:
<action name="myAction" class="myActionClass">
<interceptor-ref name="defaultStack">
<param name=" validation.excludeMethods">myValidationExcludeMethod</param>
<param name=" workflow.excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>
</action>
方法三:
<interceptors>
<interceptor-stack name="parentStack">
<interceptor-ref name="defaultStack">
<param name="params.excludeParams">token</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="parentStack"/>
拦截器参数重载(主要是对拦截器本身属性的重载)
<interceptor-stack name="parentStack">
<interceptor-ref name="postPrepareParameterFilter">
<param name="defaultBlock">true</param>
</interceptor-ref>
</interceptor-stack>
<package name="child2" namespace="/child" extends="parentPackage">
<action name="list" class="SomeAction">
<interceptor-ref name="parentStack">
<param name="postPrepareParameterFilter.allowed">myObject.name</param>
</interceptor-ref>
</action>
</package>
拦截器实现了com.opensymphony.xwork2.interceptor.PreResultListener,会在action执行之后执行,在result之前执行
thisWillRunFirstInterceptor
thisWillRunNextInterceptor
followedByThisInterceptor
thisWillRunLastInterceptor
MyAction1
MyAction2 (chain)
MyPreResultListener
MyResult (result)
thisWillRunLastInterceptor
followedByThisInterceptor
thisWillRunNextInterceptor
thisWillRunFirstInterceptor
翻译自http://struts.apache.org/docs/interceptors.html
很多action有共通的关注点。有些action需要对input进行check,有些action可能需要对文件上传进行预处理,有些action需要对多次提交进行保护,
很多action在页面显示之前,需要下拉列表和其他控件预填充。
struts2通过使用拦截器使得共享action关注点的解决方案变得容易。当url请求 一个已经map到action的资源时,框架会调用action类,但是在action被执行之前
调用会被另一个类拦截。Action执行之后,调用会被再次拦截。拦截类我们称之为拦截器
拦截器的理解
在一些情况下,因为多次提交或者验证失败,所以一个拦截器可能需要保持一个action不断执行。拦截器也能够在action执行之前,改变action的状态
自定义struts.xml
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="timer" class=".."/>
<interceptor name="logger" class=".."/>
<interceptor-stack name="myStack">
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
</interceptor-stack>
</interceptors>
<action name="login"
class="tutuorial.Login">
<interceptor-ref name="myStack"/>
<result name="input">login.jsp</result>
<result name="success"
type="redirectAction">/secure/home</result>
</action>
</package>
方法过滤
MethodFilterInterceptor是一个抽象拦截器,可以作为一个自定义具体拦截器的基类。而这个具体拦截器可以根据列出的action的方法名字进行有选择的拦截执行。
默认情况下会拦截action中所有的方法
过滤器包含了两种参数:
excludeMethods:指定的action方法都不会被拦截
includeMethods:指定的action方法都会拦截
说明:如果一个方法名字在两个地方都存在,则会被认为是include的方法
扩展了此能力的拦截器有:
TokenInterceptor
TokenSessionStoreInterceptor
DefaultWorkflowInterceptor
ValidationInterceptor
拦截器参数重载(主要是对默认struts配置文件里面的配置进行重载)
拦截器的参数可以用一下几种方式重载
方法一:
<action name="myAction" class="myActionClass">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="params"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name=" excludeMethods">myValidationExcudeMethod</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name=" excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>
</action>
方法二:
<action name="myAction" class="myActionClass">
<interceptor-ref name="defaultStack">
<param name=" validation.excludeMethods">myValidationExcludeMethod</param>
<param name=" workflow.excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>
</action>
方法三:
<interceptors>
<interceptor-stack name="parentStack">
<interceptor-ref name="defaultStack">
<param name="params.excludeParams">token</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="parentStack"/>
拦截器参数重载(主要是对拦截器本身属性的重载)
<interceptor-stack name="parentStack">
<interceptor-ref name="postPrepareParameterFilter">
<param name="defaultBlock">true</param>
</interceptor-ref>
</interceptor-stack>
<package name="child2" namespace="/child" extends="parentPackage">
<action name="list" class="SomeAction">
<interceptor-ref name="parentStack">
<param name="postPrepareParameterFilter.allowed">myObject.name</param>
</interceptor-ref>
</action>
</package>
拦截器实现了com.opensymphony.xwork2.interceptor.PreResultListener,会在action执行之后执行,在result之前执行
thisWillRunFirstInterceptor
thisWillRunNextInterceptor
followedByThisInterceptor
thisWillRunLastInterceptor
MyAction1
MyAction2 (chain)
MyPreResultListener
MyResult (result)
thisWillRunLastInterceptor
followedByThisInterceptor
thisWillRunNextInterceptor
thisWillRunFirstInterceptor
翻译自http://struts.apache.org/docs/interceptors.html