1. 關於值棧:
1). 登陸 時, ${userName} 讀取 userName 值, 實際上該屬性並不在 request 等域對象中, 而是從值棧中獲取的.
2). ValueStack:
I. 可以從 ActionContext 中獲取值棧對象
//1. 獲取值棧
ValueStack valueStack = ActionContext.getContext().getValueStack();
//2. 創建 Test 對象, 並為其屬性賦值
Test object = new Test();
object.setUserName("abc");
object.setUserPsw("123");
//3. 把 Test 對象壓入到值棧的棧頂!
valueStack.push(object);
II. 值棧分為兩個邏輯部分
> Map 棧: 實際上是 OgnlContext 類型, 是個 Map, 也是對 ActionContext 的一個引用. 裡邊保存著各種 Map:
requestMap, sessionMap, applicationMap, parametersMap, attr
> 對象棧: 實際上是 CompoundRoot 類型, 是一個使用 ArrayList 定義的棧. 裡邊保存各種和當前 Action 實例相關的對象.
是一個數據結構意義的棧.
2. Struts2 利用 s:property 標簽和 OGNL 表達式來讀取值棧中的屬性值
1). 值棧中的屬性值:
> 對於對象棧: 對象棧中某一個對象的屬性值
> Map 棧: request, session, application 的一個屬性值 或 一個請求參數的值.
2). 讀取對象棧中對象的屬性:
> 若想訪問 Object Stack 裡的某個對象的屬性. 可以使用以下幾種形式之一:
object.propertyName ; object['propertyName'] ; object["propertyName"]
> ObjectStack 裡的對象可以通過一個從零開始的下標來引用. ObjectStack 裡的棧頂對象可以用 [0] 來引用,
它下面的那個對象可以用 [1] 引用.
[0].message
> [n] 的含義是從第 n 個開始搜索, 而不是只搜索第 n 個對象
> 若從棧頂對象開始搜索, 則可以省略下標部分: message
> 結合 s:property 標簽: <s:property value="[0].message" /> <s:property value="message" />
3). 默認情況下, Action 對象會被 Struts2 自動的放到值棧的棧頂.