一、值棧(ValueStack)
1.實現類:OGNLValueStack
2.對象棧:CompoundRoot(針對的是類級別的)
(1)繼承自 ArrayList —— 先進後出
(2)提供了棧的幾個操作:peek() 返回棧頂對象,pop() 彈出棧頂對象,push() 將對象壓入棧頂
(3)默認情況下,會將當前 Action 對象壓入棧頂。通過這個 Action 對象,可以訪問到該 Action 的所有屬性以及錯誤信息。
(4)獲取方式
可以通過 ValueStack 對象的 getRoot() 方法來獲取到。
(5)頁面中獲取對象棧中的內容:
結合 struts2 標簽和 OGNL,不需要指定根,默認為值棧。唯一需要注意的一點是:會從指定下標開始向下查找第一個 屬性,若不指定,則從棧頂開始向下找。
如:<s:property value="[1].userName"/>
3.Map棧(針對的是 action 級別的,方法級別的)(相當於一個容器,存放了所有的東西,所有東西的獲取都可以從它裡拿)
(1)ActionContext 中的 context 就是 Map棧,和從 ValueStack 中獲取的 context 是一個東西。
(2)內容:
原生的 Web 資源,
Web資源對應的 Map 對象(通過 ActionContext 獲取 sessionMap 等,其實也是從 Map 棧中獲取的)
ValueStack 對象
Action 類運行相關的環境信息
(3)獲取方式:
後台:Map<String, Object> context = ActionContext.getContext().getValueStack().getContext();
(4)頁面中獲取 Map 棧中的數據:
結合 Struts2 標簽和 OGNL 來取值,指定 #。
如:<s:property value="#request.requestAttrKey"/>
(5)Map 棧結構如圖:
4.ValueStack 對象的獲取方式:
(1)通過 ActionContext 對象獲得
ValueStack valueStack = ActionContext.getContext().getValueStack();
(2)通過讀取請求域獲取
ValueStack valueStack = (ValueStack) request.get("struts.valueStack");
(3)通過 ServletActionContext 獲取
ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());
5.Struts2會為每一個請求創建一個 ValueStack 對象,保證了線程安全。
對象棧是針對 Action 類或者手動壓入棧頂的對象,而 map 棧針對的是一個 action 請求,針對的是方法,在方法中我們可以得到的東西或者可以設置的東西,在map棧中就能夠體現。
二、OGNL(對象圖導航語言)
1.本身不屬於 Struts2 ,是屬於 Apache Common 下的一個子項目。ognl-3.0.6.jar,依賴 javassist-3.11.0.GA.jar
2.未指定上下文,從根對象中讀取數據:
(1)從 root 對象中讀取 rootProperty 屬性:
Object value = Ognl.getValue("rootProperty", root);
(2)從 rootList 或是 rootArray 中讀取 第一個 root 的 rootProperty 屬性:
Object value = Ognl.getValue("[0].rootProperty", rootList);
(3)從 rootMap 中讀取屬性 rootMapKey01 對應的值:
e1:
Object depart02 = Ognl.getValue("rootMapKey01", rootMap);
e2:
HashMap<String, String> map = new HashMap<>(); map.put("attr.name", "attr.value"); Object value = Ognl.getValue("['attr.name']", map);
3.同時指定了上下文(必須為一個Map對象)和根(為一個 List)
(1)若指定了 #,則表示從 Map 中查找
Object value = Ognl.getValue("#mapKey02.propertyName", map, rootList);
(2)若沒有指定 #,則表示從根中查找
Object value = Ognl.getValue("[1].propertyName", map, rootList);
4.調用非靜態方法:
Object value = Ognl.getValue("size()", list);
5.調用靜態方法:
e1:
Object value = Ognl.getValue("@java.lang.Math@PI", null);
e2:
Object value1 = Ognl.getValue("@java.lang.Math@floor('3.14')", null);
推薦閱讀:
Struts中異步傳送XML和JSON類型的數據 http://www.linuxidc.com/Linux/2013-08/88247.htm
Struts2的入門實例 http://www.linuxidc.com/Linux/2013-05/84618.htm
Struts2學習筆記-Value Stack(值棧)和OGNL表達式 http://www.linuxidc.com/Linux/2015-07/120529.htm
struts2文件上傳(保存為BLOB格式) http://www.linuxidc.com/Linux/2014-06/102905.htm
Struts2的入門實例 http://www.linuxidc.com/Linux/2013-05/84618.htm
Struts2實現ModelDriven接口 http://www.linuxidc.com/Linux/2014-04/99466.htm
遇到的Struts2文件下載亂碼問題 http://www.linuxidc.com/Linux/2014-03/98990.htm
Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm
Struts2 注解模式的幾個知識點 http://www.linuxidc.com/Linux/2013-06/85830.htm
Struts 的詳細介紹:請點這裡
Struts 的下載地址:請點這裡