在Java的Struts框架中ONGL表達(dá)式的基礎(chǔ)使用入門
首先了解下OGNL的概念:
OGNL是Object-Graph Navigation Language的縮寫,全稱為對象圖導(dǎo)航語言,是一種功能強(qiáng)大的表達(dá)式語言,它通過簡單一致的語法,可以任意存取對象的屬性或者調(diào)用對象的方法,能夠遍歷整個(gè)對象的結(jié)構(gòu)圖,實(shí)現(xiàn)對象屬性類型的轉(zhuǎn)換等功能。
此外,還得先需弄懂OGNL的一些知識:
1.OGNL表達(dá)式的計(jì)算是圍繞OGNL上下文進(jìn)行的。
OGNL上下文實(shí)際上就是一個(gè)Map對象,由ognl.OgnlContext類表示。它里面可以存放很多個(gè)JavaBean對象。它有一個(gè)上下文根對象。
上下文中的根對象可以直接使用名來訪問或直接使用它的屬性名訪問它的屬性值。否則要加前綴“#key”。
2.Struts2的標(biāo)簽庫都是使用OGNL表達(dá)式來訪問ActionContext中的對象數(shù)據(jù)的。如:<s:propertyvalue="xxx"/>。
3.Struts2將ActionContext設(shè)置為OGNL上下文,并將值棧作為OGNL的根對象放置到ActionContext中。
4.值棧(ValueStack) :
可以在值棧中放入、刪除、查詢對象。訪問值棧中的對象不用“#”。
Struts2總是把當(dāng)前Action實(shí)例放置在棧頂。所以在OGNL中引用Action中的屬性也可以省略“#”。
5.調(diào)用ActionContext的put(key,value)放入的數(shù)據(jù),需要使用#訪問。
OGNL中重要的3個(gè)符號:#、%、$:
#、%和$符號在OGNL表達(dá)式中經(jīng)常出現(xiàn),而這三種符號也是開發(fā)者不容易掌握和理解的部分,需要時(shí)間的積累才漸漸弄清楚……
1.#符號
#符號的用途一般有三種。
訪問非根對象屬性,例如#session.msg表達(dá)式,由于Struts 2中值棧被視為根對象,所以訪問其他非根對象時(shí),需要加#前綴。實(shí)際上,#相當(dāng)于ActionContext. getContext();#session.msg表達(dá)式相當(dāng)于ActionContext.getContext().getSession(). getAttribute("msg") 。
用于過濾和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。
用來構(gòu)造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。
2.%符號
%符號的用途是在標(biāo)志的屬性為字符串類型時(shí),計(jì)算OGNL表達(dá)式的值,這個(gè)類似js中的eval,很暴力。
3.$符號
$符號主要有兩個(gè)方面的用途。
在國際化資源文件中,引用OGNL表達(dá)式,例如國際化資源文件中的代碼:reg.agerange=國際化資源信息:年齡必須在${min}同${max}之間。
在Struts 2框架的配置文件中引用OGNL表達(dá)式,例如:
<validators>
<field name="intb">
<field-validator type="int">
<param name="min">10</param>
<param name="max">100</param>
<message>BAction-test校驗(yàn):數(shù)字必須為${min}為${max}之間!</message>
</field-validator>
</field>
</validators>
示例:第一個(gè)OGNL程序
public class OGNL1
{
public static void main(String[] args)
{
/* 創(chuàng)建一個(gè)Person對象 */
Person person = new Person();
person.setName("zhangsan");
try
{
/* 從person對象中獲取name屬性的值 */
Object value = Ognl.getValue("name", person);
System.out.println(value);
}
catch (OgnlException e)
{
e.printStackTrace();
}
}
}
class Person
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
控制臺輸出:
zhangsan
可以看到我們正確的取得了person對象的name屬性值,該getValue聲明如下:
public static <T> T getValue(String expression,Object root)throws OgnlException Convenience method that combines calls to parseExpression and getValue. Parameters: expression - the OGNL expression to be parsed root - the root object for the OGNL expression Returns: the result of evaluating the expression
OGNL會根據(jù)表達(dá)式從根對象(root)中提取值。
相關(guān)文章
Spring Data Jpa實(shí)現(xiàn)自定義repository轉(zhuǎn)DTO
這篇文章主要介紹了Spring Data Jpa實(shí)現(xiàn)自定義repository轉(zhuǎn)DTO,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
解決@CachePut設(shè)置的key值無法與@CacheValue的值匹配問題
這篇文章主要介紹了解決@CachePut設(shè)置的key的值無法與@CacheValue的值匹配問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Springcloud服務(wù)注冊consul客戶端過程解析
這篇文章主要介紹了Springcloud服務(wù)注冊consul客戶端過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
mybatis連接數(shù)據(jù)庫實(shí)現(xiàn)雙表查詢
本文主要介紹了mybatis連接數(shù)據(jù)庫實(shí)現(xiàn)雙表查詢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09
SpringBoot+netty-socketio實(shí)現(xiàn)服務(wù)器端消息推送
這篇文章主要介紹了SpringBoot+netty-socketio實(shí)現(xiàn)服務(wù)器端消息推送,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
在Struts2中如何將父類屬性序列化為JSON格式的解決方法
本篇文章,小編將為大家介紹關(guān)于在Struts2中如何將父類屬性序列化為JSON格式的解決方法,有需要的朋友可以參考一下2013-04-04
metershpere實(shí)現(xiàn)調(diào)用自定義jar包中的方法
在MeterSphere接口測試中,面對多層循環(huán)邏輯和邏輯判斷等復(fù)雜情況,直接編寫測試用例往往顯得混亂不便,本文介紹了一個(gè)簡化這一過程的方法:首先使用IDEA創(chuàng)建Maven工程,編寫所需邏輯并生成jar包;然后在MeterSphere中上傳此jar包2024-10-10

