OGNL 详解
Struts2?OGNL詳解
1.概念:
OGNL是Object-Graph?Navigation?Language的縮寫,全稱為對象圖導航語言,是一種功能強大的表達式語言,它通過簡單一致的語法,可以任意存取對象的屬性或者調用對象的方法,能夠遍歷整個對象的結構圖,實現對象屬性類型的轉換等功能。OGNL表達式為Struts2標簽庫服務,就像EL表達式為JSTL服務。因此要學習Struts2標簽庫,就要了解OGNL
?
2.OGNL層次結構:
注意:上下文中的根對象(ValueStack)可以直接使用名來訪問或直接使用它的屬性名訪問它的屬性值。否則要加前綴“#key”。
ValueStack對象。這個對象貫穿整個Action的生命周期(每個Action類的對象實例會擁有一個ValueStack對象)。當?Struts?2接收到一個.action的請求后,會先建立Action類的對象實例,但并不會調用Action方法,而是先將Action類的相應屬性放到?ValueStack對象的頂層節點(ValueStack對象相當于一個棧)。
在Action中獲得ValueStack對象:ActionContext.getContext().getValueStack()
l?????????Top語法
使用Top獲取值棧中的第二個對象:<s:property?value="[1].top.對象"/>
l?????????N語法
使用N獲取值棧中的第二個對象:<s:property?value="[N].對象"/>
l?????????@語法
調用action中的靜態方法:<s:property?value="@vs1@靜態方法"/>?vs:值棧?1:表示第一個。
?
?
3.OGNL?API:
OGNL的API看起來就是兩個簡單的靜態方法:
??public?static?Object?getValue(?Object?tree,?Map?context,?Object?root?)?throws?OgnlException;
??public?static?void?setValue(?Object?tree,?Map?context,?Object?root,?Object?value?)?throws?OgnlException
1)?OGNL表達式的計算是圍繞OGNL上下文進行的。
OGNL上下文實際上就是一個Map對象,由ognl.OgnlContext類表示。它里面可以存放很多個JavaBean對象。它有一個上下文根對象。
上下文中的根對象可以直接使用名來訪問或直接使用它的屬性名訪問它的屬性值。否則要加前綴“#key”。
2)?Struts2的標簽庫都是使用OGNL表達式來訪問ActionContext中的對象數據的。如:<s:propertyvalue="xxx"/>。
3)?Struts2將ActionContext設置為OGNL上下文,并將值棧作為OGNL的根對象放置到ActionContext中。
4)?值棧(ValueStack)?:
可以在值棧中放入、刪除、查詢對象。訪問值棧中的對象不用“#”。
Struts2總是把當前Action實例放置在棧頂。所以在OGNL中引用Action中的屬性也可以省略“#”。
5)?調用ActionContext的put(key,value)放入的數據,需要使用#訪問。
?
4.OGNL中三個重要的符號
"#"的三種主要用法
訪問OGNL上下文和Action上下文,#相當于ActionContext.getContext()
| 名稱 | 作用 | 例子 |
| parameters | 包含當前HTTP請求參數的Map | #parameters.id[0]作用相當于 request.getParameter("id") |
| request | 包含當前HttpServletRequest的屬性(attribute)的Map | #request.userName相當于 request.getAttribute("userName") |
| session | 包含當前HttpSession的屬性(attribute)的Map | #session.userName相當于 session.getAttribute("userName") |
| application | 包含當前應用的ServletContext的屬性(attribute)的Map | #application.userName相當于 application.getAttribute("userName") |
| attr | 用于按request?>?session?>?application順序訪問其屬性(attribute) | ? |
?
用于過濾和投影集合
構造Map,如#{key1:value1,key2:value2...}
"%"的用途
在標志的屬性為字符串類型時,計算OGNL表達式的值
"$"的主要用途
用于國際化資源文件中,引用OGNL表達式的值
在Struts2配置文件中,引用OGNL表達式
?
轉載于:https://www.cnblogs.com/hezhiyaun/p/5505283.html
總結
- 上一篇: 对象转JSON首字母大写
- 下一篇: 生物基因结构