Struts2攔截器

jopen 10年前發布 | 12K 次閱讀 Struts2 Web框架

攔截器可以在動作執行之前或之后執行附加的動作。常見的應用有身份驗證、日志記錄等。

 

默認攔截器定義在struts-default包中。其中有幾個重要的攔截器:

  • params。它的作用是將請求中的數據映射到動作JavaBean中。
  • static-params。它的作用是將action配置中的參數傳遞給Action。它比ParametersInterceptor優先執行,因此可以用于實現參數的默認值。
  • workflow。作用是驗證。它的作用是調用action中的validate等方法,如果驗證失敗,就停止執行。
  • validation。作用是驗證。與workflow不同的是,它通過Annotation的方式進行驗證,無須編寫驗證代碼。
  • prepare。用來調用prepareInput、prepareUpdate等方法。
  • token。用于防止表單重復提交。它是一個表單的隱藏域,用<s:token/>實現。
  • servletConfig。將servlet中的session、request、application等傳遞給Action。Action需要實現SessionAware、RequestAware等接口才能接收到Servlet對象。

 

對于每個攔截器,每次請求intercept只會被調用一次。intercept一般都會調用invoke方法,它的作用是執行下一個攔截器,如果沒有下一個攔截器,那么會執行Action中的代碼。下面是一個攔截器的例子,注意它在動作執行前和執行后都增加了額外的操作。

    public String intercept(ActionInvocation invoker) throws Exception {  
        System.out.println("Before invoke");  
        String result = invoker.invoke();  
        System.out.println("After invoke");  
    }  

 

所以攔截器的工作流程是這樣的:首先框架調用第一個攔截器,第一個攔截器通過invoke方法調用第二個攔截器,第二個攔截器也是通過同一個invoke方法調用第三個攔截器,這樣一條很長的調用鏈下來,直到攔截器調用完成為止,最后執行Action中的代碼。

 

invoke方法,第一次調用的時候會執行第一個攔截器,第二次調用執行第二個攔截器……最后一次調用執行Action中的代碼。它的返回值含義是視圖名稱,所以在攔截器中可以代替Action提前返回視圖名稱。

 

攔截器的配置。在struts.xml文件中,攔截器的配置應該包括兩個部分,聲明攔截器、定義攔截器棧。

聲明攔截器的代碼示例如下。一個包中只能有一個interceptors標簽。

    <interceptors>  
      <interceptor name="params" class="ParametersInterceptor"/>  
      <interceptor name="timer" class="TimerInterceptor"/>  
    </interceptors>  

這樣攔截器就聲明好了,接下來定義攔截器棧。在引用攔截器的時候可以傳入參數。

    <interceptor-stack name="defaultStack">  
      <interceptor-ref name="params"/>  
      <interceptor-ref name="workflow">  
        <param name="execludeMethod>input,back,cancel</param>  
      </interceptor-ref>  
    </interceptor-stack>  

    <default-interceptor-ref name="defaultStack"/>  

 

給動作指定攔截器。需要注意的是,只要指定了任何一個攔截器,那么默認的攔截器就不會執行。

<action name="MyAction" class="com.test.MyAction">  
  <interceptor-ref name="timer"/>  
  <interceptor-ref name="logger"/>  
  <interceptor-ref name="defaultStack"/>  
  <result>success.jsp</result>  
</action>  

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!