10、自定義攔截器

1、Struts2 攔截器

  • 攔截器(Interceptor)是 Struts 2 的核心組成部分。
  • Struts2 很多功能都是構(gòu)建在攔截器基礎(chǔ)之上的,例如文件的上傳和下載、國際化、數(shù)據(jù)類型轉(zhuǎn)換和數(shù)據(jù)校驗(yàn)等等。
  • Struts2 攔截器在訪問某個(gè) Action 方法之前或之后實(shí)施攔截
  • Struts2 攔截器是可插拔的, 攔截器是 AOP(面向切面編程) 的一種實(shí)現(xiàn).
    攔截器棧(Interceptor Stack): 將攔截器按一定的順序聯(lián)結(jié)成一條鏈. 在訪問被攔截的方法時(shí), Struts2 攔截器鏈中的攔截器就會(huì)按其之前定義的順序被依次調(diào)用
    • 從攔截器進(jìn)去,再從攔截器出來

2、 Struts2自帶的攔截器

3、Interceptor 接口

  • 每個(gè)攔截器都是實(shí)現(xiàn)了 com.opensymphony.xwork2.interceptor.Interceptor 接口的 Java 類:
public interface Interceptor extends Serializable {
 
    void destroy();
    void init();
    String intercept(ActionInvocation invocation) throws Exception;
 
}
  • init: 該方法將在攔截器被創(chuàng)建后立即被調(diào)用, 它在攔截器的生命周期內(nèi)只被調(diào)用一次. 可以在該方法中對相關(guān)資源進(jìn)行必要的初始化
  • interecept: 每攔截一個(gè)請求, 該方法就會(huì)被調(diào)用一次.
  • destroy: 該方法將在攔截器被銷毀之前被調(diào)用, 它在攔截器的生命周期內(nèi)也只被調(diào)用一次.
  • Struts 會(huì)依次調(diào)用為某個(gè) Action 而注冊的每一個(gè)攔截器的 interecept 方法.
  • 每次調(diào)用 interecept 方法時(shí), Struts 會(huì)傳遞一個(gè) ActionInvocation 接口的實(shí)例.
  • ActionInvocation: 代表一個(gè)給定 Action 的執(zhí)行狀態(tài), 攔截器可以從該類的對象里獲得與該 Action 相關(guān)聯(lián)的 Action 對象和 Result 對象. 在完成攔截器自己的任務(wù)之后, 攔截器將調(diào)用 ActionInvocation 對象的 invoke 方法前進(jìn)到 Action 處理流程的下一個(gè)環(huán)節(jié).
  • AbstractInterceptor實(shí)現(xiàn)了 Interceptor 接口. 并為 init, destroy 提供了一個(gè)空白的實(shí)現(xiàn)

4、自定義攔截器

  • 定義自定義攔截器的步驟

    • 自定義攔截器
    • 在 struts.xml 文件中配置自定義的攔截器
  • 示例代碼:

  • 自定義攔截器

public class MyInterceptor extends AbstractInterceptor{

    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("before invocation.invoke...");

        String result = invocation.invoke();
        System.out.println("after invocation.invoke...");
        return result;
        //return "success"; 直接返回一個(gè)值,將不會(huì)調(diào)用后面的攔截器
    }

}
  • 在struts.xml配置文件中注冊攔截器-在package標(biāo)簽中注冊攔截器
 <interceptors>
   <!-- 配置攔截器 -->
   <interceptor name="myInterceptor" class="org.pan.struts.interceptor.MyInterceptor"/>
   <interceptor-stack name="myIntercepterStack">
       <interceptor-ref name="paramsPrepareParamsStack"/>
   </interceptor-stack>
</interceptors>
  • 使用攔截器: 在action中使用攔截器
    • 注意:如果在action中引用了自定義攔截器,那么還需要在引入默認(rèn)的攔截器棧,
    • 如果不引用則整個(gè)Action只會(huì)經(jīng)過自定義攔截器,而不會(huì)在調(diào)用其他的攔截器,
    • 通過interceptor-ref來決定攔截器的執(zhí)行位置,越靠前則越先執(zhí)行
<action name="user_*" class="org.pan.struts.action.TestValidationAction" method="{1}">
    <!--使用攔截器 -->
    <interceptor-ref name="myInterceptor"/>
    <!-- 還需要引用攔截器器棧 -->
    <interceptor-ref name="myIntercepterStack"/>

    <result name="success">/WEB-INF/views/success.jsp</result>
    <result name="{1}">/WEB-INF/views/{1}.jsp</result>
    <result name="input">/WEB-INF/views/input.jsp</result>
</action>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容