struts2執行流程分析
struts2框架的的執行流程:(使用者要訪問一個Action類)
當web伺服器啟動的時候:
1.第一步:web伺服器啟動的時候讀取到了web.xml檔案中,使用者已經配置了一個struts2的一個核心過濾器,這時候在訪問過濾器配置的過濾請求的時候要先經過此過濾器。而經過此過濾器之前,要先經過伺服器的一些過濾器,然後到達struts2的核心過濾器即StrutsPrepareAndExecuteFilter。
2.按照過濾器建立的標準流程,會先呼叫過濾器的構造方法-->init()方法-->dofilter()方法-->destroy()方法。
2.1 構造方法就是直接呼叫構造器的函式。
2.2 init(FilterConfig filterConfig)方法。這個方法主要是用來得到web伺服器通過filterConfig
傳過來的初始化引數,然後載入
default.properties,struts-default.xml,struts-plugin.xml,struts.xml配置檔案。並將這些資訊封裝在自己的一個內部物件PrepareOperations中。(在接下來的操作中我們可以通過這個物件中封裝的資訊得到想要訪問的Action等資訊)
接收伺服器傳過來的初始化引數,將伺服器傳遞過來的filterConfig封裝到自己內部的FilterHostConfig物件中。
2.3 初始化完成以後,接著會執行dofilter()操作。這個操作開始進行了一些常規的設定比如設定編碼方式,國際化等,同時建立了一個很重要的物件就是Action的上下文物件。接著會獲取ActionMapping物件。ActionMapping物件裡儲存了使用者在struts.xml檔案中配置的Action的各種資訊,包括名稱空間,Action名字,返回結果,引數等資訊。當用戶請求的路徑通過解析可以在ActionMapping物件中找到一個Action類處理此請求,則請求成功。接著過濾器會將請求傳送給ActionProxy物件,為請求對應的Action類建立一個代理物件,並在代理物件中根據配置檔案中配置的攔截器棧中的攔截器,按順序呼叫攔截器方法,接著執行Action類中配置的方法,接著將結果跳轉到result中指定的頁面。然後反向執行攔截器,這樣dofilter()方法就執行完畢了。
注意:1)通過上面的分析我們可以看出,使用者不會直接執行action,而是通過代理物件的方法使用Action類中的方法。
2)攔截器中的方法是通過動態代理模式呼叫的,而過濾器則是過濾使用者的請求的。攔截器方法是通過反射實現,而過濾器方法就是直接是方法回撥的方式實現。