<b>閱讀目錄</b>
<a href="http://www.cnblogs.com/java-class/p/5155793.html#_label0">1.這部分架構類關系</a>
<a href="http://www.cnblogs.com/java-class/p/5155793.html#_label1">2.webwork 擷取和包裝 web 參數</a>
<a href="http://www.cnblogs.com/java-class/p/5155793.html#_label2">3.defaultactionproxyfactory、defaultactionproxy、defaultactioninvocation</a>
一路走來,終于要開始 webwork 核心業務類的總結,webwork 通過對用戶端傳遞的 web 參數重新包裝,進行執行業務 action 類,并回報執行結果,本篇源碼分析對應下圖 webwork 架構流轉圖中紅色框的地方。

每個web 架構或多或少的對 web 請求參數的包裝,用來拿來友善自己使用,當然webwork 也不例外。
webwork 每次響應請求的入口方法:
接受 request 、response 參數,并對 request 參數進行封裝,這次封裝主要是針對多媒體請求進行的特殊處理,例如項目中的檔案上傳請求,導出各種類型檔案等...
包裝完 request 之後,service 方法調用 servletdispatche.serviceaction() 方法,并調用 getapplicationmap、getsessionmap、getrequestmap、 getparametermap、getactionname、getnamespace 6 個方法開始了action 業務邏輯調用前的前戲。
getnamespace 方法用來獲得一個action所屬的名稱空間,例如 : "/my/myaction.action"則傳回"/my",具體實作如下:
getactionname 傳回請求的action的名字,例如:"myaction.action"則傳回"myaction",具體實作如下:
getrequestmap 方法傳回一個包含請求中所有屬性的map,具體實作類是 requestmap,具體代碼如下:
getparametermap 方法傳回一個包含請求中所有參數的map,具體代碼如下:
getsessionmap 方法傳回一個包含 session 中所有屬性的 map,具體實作類是 sessionmap,具體代碼如下:
getapplicationmap 方法傳回一個包含 application 中所有屬性的map,具體實作類 是applicationmap,具體代碼如下:
webwork之是以要把request 的屬性、參數,session 中的屬性,application 中的屬性封裝成 map,僅僅是為了自己使用友善。
首先 serviceaction 調用了createcontextmap 建立action 上下文(extracontext)。 它将javaservlet 相關的對象進行包裝,放入extracontext map對象裡。
接着檢查 上一個請求中是否有可用的值堆棧,如果有就放入extracontext 這個map 對象裡,供本次請求使用 。
actioncontext(com.opensymphony.xwork.actioncontext)是action執行時的上下文,上下文 可以看作是一個容器(其實我們這裡的容器就是一個map 而已),它存放的是action 在執行時需要用到的對象。
servletactioncontext ( com.opensymphony.webwork. servletactioncontext),這個類直接繼承了actioncontext,它提供了直接與javaservlet 相關象通路的功能。
ognlvaluestack主要的功能是通過表達式語言來存取對象的屬性。
通過由前面獲得的namespace、actionname、extracontext 建立調用代理 actonproxy 執行個體,這裡也就是 defaultactionproxy,之後調用 了 actionproxy.execute 方法來執行我們邏輯action.execute。
actionproxy是一個接口,actionproxyfactory則是一個抽象類,預設情況下它們是通過 defaultactionproxy和defaultactionproxyfactory來完成操作的。
在 actionproxyfactory 中有一個靜态變量 factory ,它指向的是一個 defaultactionproxyfactory 執行個體,代碼如下:
defaultactionproxyfactory 的 createactionproxy 方法傳回了 defaultactionproxy 執行個體。
defaultactionproxy的構造函數
将傳入的名稱空間、 action 的名字等參數賦予本地變量,接着通過 configurationmanager 獲得目前請求的 action 的配置資訊[這裡在5中已經描述過]。接着調用自身的 prepare 方法建立一個 actioninvocation 對象賦予自身變量 invocation。在之後的 execute 方法中通過操縱invocation 來實作我們自己寫的action 的調用。
如果,您認為閱讀這篇部落格讓您有些收獲,不妨點選一下右下角的【推薦】
如果,您希望更容易地發現我的新部落格,不妨點選一下左下角的【關注我】
如果,您對我的部落格内容感興趣,請繼續關注我的後續部落格,我是【orson】
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段 聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
轉載:http://www.cnblogs.com/java-class/p/5155793.html