1. 能夠做爲一個數據中轉站 web
2. 用於在前臺-後臺之間傳遞數據,最典型的作法就是struts2標籤也ognl表達式的結合。我用得最多的就是數據回顯。 spa
在struts-default.xml文件中決定了在web容器啓動時將會建立OgnlValueStackFactory對象,該對象實現了ValueStackFactory接口,負責ValueStack的建立工做。 xml
ValueStack的生命週期是隨着request的建立而建立,隨request的銷燬而銷燬。具體可見源代碼: 對象
在PrepareOperations類的createActionContext中有 繼承
至於清理工做,struts統一放在了PrepareOperations類的cleanupRequest方法中。 接口
主要看OgnlValueStack類,此類實現了ValueStack接口。 生命週期
在OgnlValueStack中有兩個相當重要的東西, 內存
,簡稱「對象棧」和「Map棧」。 get
CompoundRoot繼承了ArrayList類,便是一個List集合,詳見源碼CompoundRoot類。 源碼
Context:而context其實是一個hashMap,
。
其中_values就是平時使用的map棧,而_root只是對對象棧的引用。
經常使用方法解析:
1. push方法:
,再查看root的push方法
,頓時明白什麼叫將對象壓入棧頂了。
2. set(String key,Object o)方法:
再看
,
也就是說第一次使用該方法時,struts會建立一個新的map。
3. pop方法:
,移除棧頂對象,查看root的pop方法
4. peek方法
獲取棧頂對象,作法與pop方法相同,只不過是get數據。
因此便可總結出使用方法:
1. 將數據放入值棧
將對象放入棧頂:
a) ActionContext.getContext().getValueStack().push("aa);
b) ActionContext.getContext().getValueStack().getRoot().add(0,"bb");
將數據放入map棧
ActionContext.getContext().getValueStack().set(「a」,」a」);
2. 從值棧中獲取數據
a) 獲取棧頂數據
i. ActionContext.getContext().getValueStack().peek();
ii. ActionContext.getContext().getValueStack().getRoot().get(0);
通常狀況下,將對象放入棧頂以前先移除棧頂對象,這樣能夠節省內存空間。
重要:
1. Interator標籤當前迭代的對象在棧頂。
2. Iterator標籤的value能夠不寫,默認是迭代棧頂元素。