回覆列表
-
1 # izzzs14885
-
2 # 使用者9866520236700
Struts2攔截器原理:當請求到達Struts2時,Struts2查詢配置檔案,並根據配置例項化相對的攔截器物件,串成一個列表,最後一個一個呼叫列表中的攔截器。Struts2攔截器棧將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或欄位時,按其之前定義順序被呼叫。
Struts2攔截器是動態攔截Action呼叫的物件。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。
擴充套件資料:
攔截器的自定義:
1、自定義一個實現Interceptor介面(或者繼承自AbstractInterceptor)的類。
2、在struts.xml中註冊Interceptor介面中定義的攔截器。
3、在需要使用的Action中引用struts.xml定義的攔截器,為了方便也可將攔截器定義為預設的攔截器,這樣在不加特殊宣告的情況下所有的Action都被這個攔截器攔截。
4、開發者自定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。
Struts2的攔截器的實現原理和過濾器的實現差不多,對你真正想執行的 execute()方法進行攔截,然後插入一些自己的邏輯。如果沒有攔截器,這些要插入的邏輯就得寫在你自己的 Action實現中,而且每個 Action實現都要寫這些功能邏輯,這樣的實現非常繁瑣。而 Struts2的設計者們把這些共有的邏輯獨立出來,實現成一個個攔截器,既體現了軟體複用的思想,又方便程式設計師使用。 Struts2中提供了大量的攔截器,多個攔截器可以組成一個攔截器棧,系統為我們配置了一個預設的攔截器棧 defaultStack,具體包括那些攔截器以及他們的順序可以在 Struts2的開發包的 struts-default.xml中找到。在每次對你的 Action的 execute()方法請求時,系統會生成一個 ActionInvocation物件,這個物件儲存了 action和你所配置的所有的攔截器以及一些狀態資訊。比如你的應用使用的是 defaultStack,系統將會以攔截器棧配置的順序將每個攔截器包裝成一個個 InterceptorMapping(包含攔截器名字和對應的攔截器物件 )組成一個 Iterator儲存在 ActionInvocation中。在執行 ActionInvocation的 invoke()方法時會對這個 Iterator進行迭代,每次取出一個 InterceptorMapping,然後執行對應 Interceptor的 intercept(ActionInVocation inv)方法,而 intercept(ActionInInvocation inv)方法又包含當前的 ActionInInvcation物件作為引數,而在每個攔截器中又會呼叫 inv的 invoke()方法,這樣就會進入下一個攔截器執行了,這樣直到最後一個攔截器執行完,然後執行 Action的 execute()方法 (假設你沒有配置訪問方法,預設執行 Action的 execute()方法 )。在執行完 execute()方法取得了 result後又以相反的順序走出攔截器棧,這時可以做些清理工作。最後系統得到了一個 result,然後根據 result的型別做進一步操作。Struts2的攔截器的實現原理和過濾器的實現差不多,對你真正想執行的 execute()方法進行攔截,然後插入一些自己的邏輯。如果沒有攔截器,這些要插入的邏輯就得寫在你自己的 Action實現中,而且每個 Action實現都要寫這些功能邏輯,這樣的實現非常繁瑣。而 Struts2的設計者們把這些共有的邏輯獨立出來,實現成一個個攔截器,既體現了軟體複用的思想,又方便程式設計師使用。 Struts2中提供了大量的攔截器,多個攔截器可以組成一個攔截器棧,系統為我們配置了一個預設的攔截器棧 defaultStack,具體包括那些攔截器以及他們的順序可以在 Struts2的開發包的 struts-default.xml中找到。在每次對你的 Action的 execute()方法請求時,系統會生成一個 ActionInvocation物件,這個物件儲存了 action和你所配置的所有的攔截器以及一些狀態資訊。比如你的應用使用的是 defaultStack,系統將會以攔截器棧配置的順序將每個攔截器包裝成一個個 InterceptorMapping(包含攔截器名字和對應的攔截器物件 )組成一個 Iterator儲存在 ActionInvocation中。