1. 關於值棧:session
- helloworld時, ${productName} 讀取productName 的值,實際上該屬性並不在request 等域對象中,而是從值棧中獲取的
- ValueStack:
- 能夠從ActionContext 中獲取值棧對象
- 值棧分爲兩個邏輯部分
- Map棧: 實際上OgnlContext 類型,是個Map,也是對ActionContext 的一個引用,裏面存放着各類Map:
- requestMap
- sessionMap
- applicationMap
- parametersMap
- attr
- 對象棧:其實是CompindRoot 類型,是一個使用ArrayList 定義的棧。裏邊保存各類和當前Action 實例相關的對象,是一個數據結構意義的棧
2. Struts2 利用s:property 標籤和OGNL 表達式來讀取值棧中的屬性值數據結構
- 值棧中的屬性值:
- 對於對象棧: 對象中某一個對象的屬性值
- Map 棧: request, session, application 的一個屬性值 貨 一個請求參數的屬性值
- 讀取對象棧中對象的屬性
- 若想訪問Object Stack 裏面的某一個屬性,能夠使用以下幾種形式之一:
- object.propertyName
- object['propertyName']
- object["propertyName"]
- ObjectStack 裏面的對象能夠經過一個從零開始的下標來引用。ObjectStack 裏面的棧頂對象能夠用[0] 來引用,它下面的的那個對象能夠用[1] 引用
[0].messageapp
-
- [n] 的含義是從第n 個開始搜索,而不是隻搜索n個對象
- 若從棧頂對象開始搜索,則能夠省略下標部分:message
- 結合s:property 標籤:<s:property value="[0].message" /> <s:property value="message" />(一般狀況下采用這種方式)
3. 默認狀況下, Action 對象會被Struts2 自動的放到值棧的棧頂對象
4. Struts2 自動把Action 對象放入到值棧中blog
放入的時間點爲:struts2 終將調用Action 類的Action 方法。但在調用該方法以前:io
- 先建立一個StrutsActionProxy 對象
- 在建立StrutsActionProxy 以後,對其進行初始化時,把Action對象放入了值棧中。