在大概了解了struts2的action後,我們來重點研究一下在struts2的action周圍,為action進行服務的一些重要元素,這些元素將涵蓋action的資料環境,action的執行環境、action的排程者、action的層次結構和action的執行結果。
actioncontext —— 資料環境
之前我們提到了struts2的action並不是乙個servlet,它是脫離了web容器的。但是對於乙個web框架來說,所有的資料請求(request)和資料返回(response)都**於web容器,那麼action在執行的時候,如何去獲取這些資料呢?
這個問題的答案就在於,我們需要為每個action準備乙個資料環境,這個資料環境被稱之為:actioncontext。由於action是應對於乙個又乙個的url請求,所以actioncontext應該具備以下的特性:
1. actioncontext應成為action與web容器之間的橋梁
2. actioncontext中應該儲存有針對某個請求的詳細資訊
3. actioncontext應該是乙個執行緒安全的類物件
interceptor —— 豐富的層次結構
簡單回顧一下上面所提到的action的職責,我們看到,需要在action這個層面上完成的事情還不少。而完成這些職責,就需要我們對這些職責進行合理的分類和排序,將他們組織成有序的執行佇列。在struts2中,使用了一種類似責任鏈的設計模式對這些不同的職責進行分類並串聯起來,從而使得action層具備了豐富的層次結構。而在這個執行佇列中的每個元素,就被我們稱之為interceptor,也就是***。
***是aop中的概念,它本身是一段**,可以通過定義「織入點」,來指定***的**在「織入點」的前後執行,從而起到攔截的作用。正如上面struts2的reference中講述的,struts2的interceptor,其攔截的物件是action**,可以定義在action**之前或者之後執行***的**。
如果仔細留意一下action lifecycle圖中的interceptor和action的部分,我們可以看到,interceptor一層一層的把action包了起來。這是乙個典型的堆疊結構,在**執行的時候,每個interceptor不僅需要文成它自身的邏輯,還通過遞迴呼叫負責下乙個***或action的呼叫。
也正如struts2的reference所說,struts2提供的絕大多數的功能支援,都通過interceptor來實現,這些interceptor可以隨意進行配置,並且能夠方便的插入到程式中去執行。
result —— 執行結果
有執行就必然有執行的結果。在struts2中,action的執行結果被抽象成了乙個層次。在這個層次中,可以定義任意型別的view層的結構。也就是說,struts2並不強制view層的表現形式,可以是jsp、freemarker模板、二進位製流輸出等等。
struts2把執行結果抽象成乙個層次,使得你可以不再關注許多檢視整合上面的細節,只需要考慮檢視的型別和資料的準備,這樣,你也可以不必在沉浸在雜亂的構造檢視的**中。
actionproxy —— 執行環境
有了***interceptor,有了action本身,也有了action的執行結果result,我們就需要乙個類似排程器的產品,將這些元素整合起來,進行排程執行。在上面的action lifecyle的圖中,我們可以看到,interceptor、action和result都處於actionproxy中,所以actionproxy就成為了所有這些元素的執行環境。
既然是執行環境,那麼actionproxy就需要提供action執行的時候一切所需要的配置、引數等等,當然,也要有進行action呼叫的入口。prepare和execute方法是用作action呼叫的入口函式,其他的介面定義都與action執行時的執行引數和配置有關。
actioninvocation —— 排程者
在上面的actionproxy的介面定義中,我們可以看到有乙個比較特殊的變數:actioninvocation比較吸引我們的眼球。從字面上去理解,actioninvocation就是action的呼叫者。事實上也是如此,actioninvocation在這個action的執行過程中,負責interceptor、action和result等一系列元素的排程。
在之後的章節中,這個actioninvocation類也將成為我們解讀struts2原始碼的乙個重要入手點。這個類將告訴你,struts2是如何通過actioninvocation來實現對interceptor、action和result的合理排程的。
struts2 中action返回的型別
在struts2框架中,當action處理完之後,就應該向使用者返回結果資訊,該任務被分為兩部分 結果型別和結果本身。結果型別提供了返回給使用者資訊型別的實現細節。結果型別通常在struts2中就已預定義好了 見下表 或者是由外掛程式提供,開發人員也可以自定義結果型別。預設配置的結果型別是dispa...
struts2的 action中得到標籤中的內容
最近用到struts2 標籤,要求在action中獲取標籤中的內容 出現這個問題後,發現確實很難實現,所以就google了下,但獲取答案卻不理想 但研究struts2的demo後,發現他們可以正常獲取的,所以就研究了下,發現問題其實很簡單 在此,借用下google時,搜尋到的乙個問題 然後提交到te...
struts2配置action驗證
背景 接昨天的struts2框架搭建 新增對action關聯form表單中input框輸入的內容進行校驗 操作測試完成後文件如下圖 使用者名稱不能為空 使用者名稱輸入不合法,必須為長度在6 16中間的數字或字母 true 密碼不能為空 密碼輸入不合法,必須為長度在6 16之間的數字或者字母 總結 配...