歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Struts2基礎——ValueStack和OGNL

Struts2基礎——ValueStack和OGNL

日期:2017/3/1 9:14:22   编辑:Linux編程

一、值棧(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 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved