Struts2攔截器
攔截器可以在動作執行之前或之后執行附加的動作。常見的應用有身份驗證、日志記錄等。
默認攔截器定義在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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!