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的類型做進一步操作。
發佈了21 篇原創文章 · 獲贊 28 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章