OGNL與值棧
- 2019 年 10 月 10 日
- 筆記
好的時光

- OGNL
- 什麼是OGNL
- OGNL功能
- OGNL簡單使用
- 值棧
- 什麼是值棧
- 值棧結構
OGNL
什麼是OGNL?
OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言,通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現欄位類型轉化等功能。
對比EL表達式:
OGNL對象圖導航語言,比EL表達式強大很多倍的語言
EL表達式只能從域中獲取數據
OGNL可以調用對象的方法,獲取struts的值棧的數據。
OGNL是第三方的表達式語言,用它來獲取struts中值棧的數據
OGNL的功能
支援運算符(如+-*/)
支援對象方法調用,如xxx.doSomeSpecial();
支援類靜態的方法調用和值訪問
支援賦值操作和表達式串聯
訪問OGNL上下文
操作集合對象
可以直接new一個對象
OGNL入門
OGNL使用要素三個:
表達式
根區
非根區(context對象)
OGNL核心OgnlContext本質是一個map
java程式中使用ognl:
在context中存取(需要#號)

在根元素中存取(不需要#)

使用對象方法和靜態方法

在頁面中使用ognl
導入標籤庫

調用靜態方法默認不行,需要開啟



值棧
什麼是值棧?
ValueStack實際上就是一個容器。是一個介面,實現類為OgnlValueStack
當用戶每次訪問action對象的業務方法時, 會先創建ActionContext對像裡面又包含OgnlValueStack對象、Action對象
它由Struts框架創建,當前端頁面如jsp發送一個請求時,Struts的默認攔截器會將請求中的數據進行封裝,併入ValueStack的棧頂。
Struts框架中的數據就都保存到了ValueStack中,各種域也是被包含在值棧當中,存到域當中只能在頁面中把它取出來存到值棧當中可以在任何地方取出數據
ValueStack貫穿整個action的生命周期, action一旦創建,就會創建一個valuestack對象
ValueStac
值棧的內部結構

當請求過來的時候,執行
StrutsPrepareAndExecuteFilter過濾器當中的doFilter方法
在這個方法當中創建ActionContext
在創建ActionContext過程中,創建ValueStack對象
將valueStack對象傳遞給ActionContext對象。通過ActionContext獲取值棧對象
ActionContext對象之所以能夠訪問servlet的API(域對象的數據)就是因為內部有值棧的引用,與action相關的存在根區請求完畢後清空,而其他域的數據存在非根區


值棧存數據
通過ActionContext類的靜態方法getContext得到ActionContext對象,ActionContext對象調用getValueStack獲取到值棧


獲取值棧
ValueStack valueStack = ActionContext.getContext().getValueStack();
根區
// getRoot()可以省略 Student stu = new Student(); valueStack.getRoot().push(stu); valueStack.getRoot().pop();
非根區
ActionContext.getContext().push(數據); ActionContext.getContext()pop();
從值棧取
用struts標籤庫的debug在頁面展示值棧資訊
使用debug需開啟
<constant name="struts.devMode" value="true"></constant>



點開debug就是當前值棧資訊


從根區當中取(注意它是從棧頂取,若根區中兩個或多個Property Name相同取到的是上面的)


成功獲取到根區的name

非根區取數據



成功獲取到非根區相應資訊
