您的位置:首页 > 编程语言 > Java开发

struts2的Interceptor配置说明(二)

2015-01-24 17:27 148 查看
默认的拦截器栈能够满足大部分应用的需求。大部分应用没有必要添加拦截器或者改变既存的拦截器栈

很多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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts 2 interceptor