天天看點

struts2攔截器的了解

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的類型做進一步操作。

繼續閱讀