struts2的Interceptor配置說明(二)

默認的攔截器棧能夠滿足大部分應用的需求。大部分應用沒有必要添加攔截器或者改變既存的攔截器棧


很多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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章