向值棧里面放數據(儲存的位置在root域里面)
向值棧放數據有多種方式,往往我們只用其中一種
1.set方法壓棧
1)在Action中獲取值棧對象,使用set()方法向值棧存放數據
ActionContext.getContext().getValueStack().set("key","value");
2)在jsp中獲取值棧數據,根據set方法的名稱(key)獲取
<s:property value="key"></s:property>
2.push方法壓棧
1)在Action中獲取值棧對象,使用push()方法向值棧存放數據,push方法只有設置的值(value),沒有名稱(key)
ActionContext.getContext().getValueStack().push("XXX");
2)push()方法會把值棧中存放的數據存到top數組中,push的取值方法有點特殊,是通過直接把棧頂元素取出來的。
3)在jsp中獲取push方法設置的值,根據top數組獲取值
<s:property value="[0].tap"></s:property>//這里的top是root的域實體對象名稱,也就是List對象的名稱
3.在action定義變量,生成變量的get方法
向值棧中放對象
實現步驟:
第一步:定義對象變量
第二步:生成變量的get方法
第三步:在執行的方法里面向對象中設置值
向值棧中放List對象
第一步:定義List集合變量
第二步:生成變量的get方法
第三步:在執行的方法里面向List集合設置值
4.擴展
值棧:在struts2里面提供了本身的一種存儲機制,類似於域對象,是值棧,可以存值和取值。
servlet和action的區別:
Servlet:默認在第一次訪問的時候創建,只創建一次,是一個單例對象!!
Action:一樣是訪問的時候創建對象,每次訪問action的時候都會創建新的action對象,創建多次,是一個多實例對象!!
值棧的存儲位置:
- 每次訪問action的時候都會創建action對象。
- 在每個action對象里面都會有一個值棧對象。(注意:每個action對象只有一個)(在同一個action值棧只有一個)
獲取值棧對象有多種方式!
- 常用的方式:使用ActionContext對象里面的方法(getValueStack())獲取值棧對象。
值棧內部結構
棧:先進后出!
最上面是棧頂的元素,向棧里面放數據的操作叫做壓棧。
值棧分為兩個部分,root和context
root專業叫做ObjectStack(對象棧)
context專業叫做ContextMap(Map棧),Map類型的棧。(在我們訪問里面的對象的時候,會通過出棧的方式取東西,效率比較低,一般我們不會用)
root結構是List集合
context結構是Map集合
(要想查看到值棧的結構可以用調試(debug)的方法,通過struts2的標簽<s:debug></s:debug>,值棧確實分為兩個部分,一個root,一個context )
