1. 程式人生 > >Struts2是怎樣通過struts.xml進行前後臺互動呢?

Struts2是怎樣通過struts.xml進行前後臺互動呢?

     首先在專案啟動的時候,專案下的Struts.xml檔案會被dom4j工具解析;而當我們傳送一個請求時,這個請求被StrutsPrepareAndExecuteFilter 攔截,而我們配置了struts處理url的攔截表示式,比如在<filter- maping>中我們配置<url -pattern> 為 /* 或 *.do的萬用字元。這樣當你傳送一個請求的時候就被攔截器給攔截下來了。

        而針對這樣的請求其實是由 struts的過濾器處理的。這個過濾器我在看原始碼的時候,發現它是在生命週期初始化的時候,在一個init()方法中 利用 filterConfig的物件,找到了專案中的struts.xml配置檔案,然後通過InitOperations() 和 Dispatcher 把 struts.xml 檔案轉換成 ActionMapping物件進行的解析。

        當我們在客戶端傳送一個請求的時侯PrepareOperations類裡面 的   prepare.createActionContext(request, response)方法會幫我們封裝 request和response ,並且建立 ValueStack(值棧物件);struts用  dispatcher 物件 的 createContextMap 方法 把 上面request和session 還有使用者傳遞過來的所有資料,通過request.getParameterMap()先獲取到前臺,然後全部封裝到了 ActionContext 和ValueStack 中,所以我們在struts2中獲取 request和session等物件的時候有一個解耦合的方式 ActionContext.getContext().get("request")就能獲取到request和session等的物件;

        比如使用者傳送了一個usermanager的請求,那麼在之前封裝好的ActionMapping中會有一個與這個請求一一對應的屬性值,通過在程式碼中執行一個 findActionMapping(request, response, true)的方法,來得到一一對應的關係,那是因為在ActionMapping中本身就包含著我們的業務Action的路徑。

        ActionProxyFactory 會生成一個 ActionProxy 對我們的業務Action進行一個反射的代理操作。所以我們Action並不是一個Servlet,但是卻能達到servlet的效果,是因為serlvet的操作都是 StrutsPrepareAndExecuteFilter的dofilter方法執行的。它通過剛才說的 ActionProxy  反射執行我們  Action中的業務方法,然後返回的值string和 ActionMapping中的Result物件進行匹配,最後在讓StrutsPrepareAndExecuteFilter 幫我們執行跳轉或轉發的功能。