1. 程式人生 > >Struts2 In Action筆記_頁面到動作的數據流入和流出

Struts2 In Action筆記_頁面到動作的數據流入和流出

.com aid nco 數據 參數 ttr stl exp http

因為回答百度知道的一個問題,仔細查看了《Struts2 In Action》,深入細致的看了 “數據轉移OGNL 和 構建視圖-標簽”,很多東西才恍然大悟。

一直覺得國外寫的書很浮,不具有操作性,但其實,Coding多了,才發現國外的書寫的深刻、清晰、能傳道解惑。

一、主要收獲

1. Struts2 框架的數據流入和流出

使用 Struts2 標簽時,所有非字符串屬性都被當作 OGNL表達式進行解析。

使用 %{expression} 語法可以強制將字符串屬性當作 OGNL表達式解析。

2. 頁面的多值提交

3. 虛擬對象 ValueStack

使用 params攔截器,將請求參數設置到 ValueStack 公開屬性中,動作 Action也被設置到 ValueStack 中。

ValueStack 中沒有基礎結構的對象(如Servlet API 或者 Struts2 的對象)。動作 Action 在 ValueStack 上是因為它作為

業務數據(請求所提交的數據)的承載者。

ValueStatck 有一個為妙的地方,當OGNL表達式根據 ValueStack解析時, 它裝作一個對象。這個虛擬對象包含它自身

包含的所有對象的所有屬性如果相同屬性存在,則棧下面的屬性會被上面的同名屬性覆蓋1

4. ActionContext

Struts2 框架的一個核心對象,動作Action的上下文。AC 包含 動作Action 相關的所有重要的數據對象。

它包括6個對象:ValueStack, parameters, application, session, attr, request。

其中,request 和 session, application 是 Sevrlet API 的 request, session, application 的翻版(映射或者說包裝)。

所以

使用 OGNL 獲取 ActionContext 中的 原生session對象中的值的方法是
#session[‘user‘] 或者 #session.user
訪問OGNL上下文和Action上下文,#相當於ActionContext.getContext();下表有幾個ActionContext中有用的屬性: 
parameters 包含當前HTTP請求參數的Map
#parameters.id[0] === request.getParameterValues("id").get(0);
request 包含當前HttpServletRequest的屬性(attribute)的Map
#request.userName === request.getAttribute("userName")
session 包含當前HttpSession的屬性(attribute)的Map
#session.userName === session.getAttribute("userName")
application 類似

另外註意區分 EL表達式、 JSTL 標簽 和 OGNL 表達式

時間有限,摘錄部分重點:

Strust2接收到一個請求時,它會立即創建一個 ActionContext、一個ValueStack 和一個動作對象 Action。作為數據承載者,動作Action 被馬上放到 ValueStack 中,以便框架可以通過 OGNL 訪問它的屬性。

1:

當Action 內 含有 name 屬性和一個 User 對象屬性,並且剛好 User 類也有個 name 屬性,根據 動作Action會先被放入ValueStack

,屬性對象後放入的順序,動作Action 的 name 屬性將不會被框架自動的 賦值,換句話說,就會被永遠無法訪問到了。

(但其實有 特定標簽put 可以解決這個問題,實際中也很少出現這個問題,不知道為何?)

參考《Struts2 In Action》 P112 ,Struts2 標簽概要。

Struts2 In Action筆記_頁面到動作的數據流入和流出