OGNL基础
OGNL是Object-Graph Navigation Language的縮寫(xiě),全稱為對(duì)象圖導(dǎo)航語(yǔ)言,是一種功能強(qiáng)大的表達(dá)式語(yǔ)言,它通過(guò)簡(jiǎn)單一致的語(yǔ)法,可以任意存取對(duì)象的屬性或者調(diào)用對(duì)象的方法,能夠遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)對(duì)象屬性類型的轉(zhuǎn)換等功能。
struts2標(biāo)簽中使用OGNL語(yǔ)言,這是一種類似于EL表達(dá)式、但是比EL表達(dá)式功能強(qiáng)大的多的語(yǔ)言。但是相對(duì)于其它的表達(dá)式語(yǔ)言如EL等,OGNL有自己的優(yōu)點(diǎn):
1、能夠訪問(wèn)對(duì)象的方法,例如list.size();
2、能夠訪問(wèn)靜態(tài)屬性與靜態(tài)方法,方法是在類名前和方法前加上@。如@java.lang.Math@PI,@java.lang.String@format(‘foo%s’,’bar’);
3、支持賦值操作和表達(dá)式串聯(lián),如賦值#value=5;
4、訪問(wèn)OGNL上下文(OGNL context)和ActionContext(所有的servlet資源);
5、操作集合類對(duì)象。
在深入學(xué)習(xí)OGNL之前,先了解一些重要的OGNL的基本知識(shí):
1、OGNL表達(dá)式的計(jì)算是圍繞OGNL上下文進(jìn)行的。OGNL上下文實(shí)際上就是一個(gè)Map對(duì)象,由ognl.OgnlContext類表示。它里面可以存放很多個(gè)JavaBean對(duì)象。它有一個(gè)上下文根對(duì)象。上下文中的根對(duì)象可以直接使用名來(lái)訪問(wèn)或直接使用它的屬性名訪問(wèn)它的屬性值。否則要加前綴#key”。
2、Struts2的標(biāo)簽庫(kù)都是使用OGNL表達(dá)式來(lái)訪問(wèn)ActionContext中的對(duì)象數(shù)據(jù)的。如:<s:propertyvalue="xxx"/>
3、Struts2將ActionContext設(shè)置為OGNL上下文,并將值棧作為OGNL的根對(duì)象放置到ActionContext中。
4、值棧(ValueStack) :可以在值棧中放入、刪除、查詢對(duì)象。訪問(wèn)值棧中的對(duì)象不用“#”。Struts2總是把當(dāng)前Action實(shí)例放置在棧頂。所以在OGNL中引用Action中的屬性也可以省略“#”。(有關(guān)值棧的詳細(xì)內(nèi)容見(jiàn)文章結(jié)尾)
5.調(diào)用ActionContext的put(key,value)放入的數(shù)據(jù),需要使用#訪問(wèn)。
OGNL語(yǔ)法類似于EL,主要使用“ . ”作為操作符。例如要訪問(wèn)person.getCountry().getName()可以這樣寫(xiě):person.country.name。在訪問(wèn)POJO屬性上,OGNL與EL表達(dá)式是完全一樣的。OGNL主要有3個(gè)符號(hào):#、 %、$,下面依次給出這3種符號(hào)的具體用法:
一、“#”聲明OGNL表達(dá)式
“#”是struts2標(biāo)簽中最常用的符號(hào)。主要有三種用途:
1、訪問(wèn)非根對(duì)象(即OGNL上下為與ActionContext資源,OGNL的根對(duì)象是值棧)屬性,例如#session.msg表達(dá)式,由于Struts2中值棧被視為根對(duì)象,所以訪問(wèn)其他非根對(duì)象時(shí),需要加#前綴。實(shí)際上,#相當(dāng)于ActionContext.getContext();#session.msg表達(dá)式相當(dāng)于ActionContext.getContext().getSession(). getAttribute(“msg”) 。
常用的“#”屬性見(jiàn)下表:
2、用于過(guò)濾或篩選集合,例如:books.{?#this.price<20},表示所有的price<20的書(shū)。
3、構(gòu)造Map,如#{'foo1':'bar1','foo2':'bar2'}。
二、“%”顯式聲明OGNL表達(dá)式
“%”類似于javascript中的eval,用途:在標(biāo)識(shí)屬性為字符串類型的同時(shí)計(jì)算OGNL表達(dá)式的值。某些標(biāo)簽中既能接受字符串,又能接受OGNL表達(dá)式,這時(shí)候,標(biāo)有“%”的被當(dāng)作OGNL表達(dá)式并被執(zhí)行,沒(méi)有標(biāo)”%“的被當(dāng)作普通字符串。例如:
<!-- 參數(shù)為普通字符串--> <struts:label label="#request.account"></struts:label><!-- 用%表示參數(shù)為OGNL表達(dá)式--> <struts:label label="%{#request.account}"></struts:label>第一行代碼會(huì)輸出字符串#request.account,而第二行會(huì)輸出request的account屬性。
三、“$”在資源文件中引用OGNL表達(dá)式
$主要用于在資源國(guó)際化文件中或者在struts.xml中引用OGNL表達(dá)式。
Resources.properties
validation.require=${getText(fieldName)} is requiredstruts.xml
<action name="AddPhoto" class="addPhoto"> <!-- 配置action --><result type="redirect">ListPhotos.action?albumId=${albumId}</result> <!-- 重定向結(jié)果 --> </action>附注:
值棧
ValueStack對(duì)象。這個(gè)對(duì)象貫穿整個(gè)Action的生命周期(每個(gè)Action類的對(duì)象實(shí)例會(huì)擁有一個(gè)ValueStack對(duì)象)。當(dāng)Struts 2接收到一個(gè).action的請(qǐng)求后,會(huì)先建立Action類的對(duì)象實(shí)例,但并不會(huì)調(diào)用Action方法,而是先將Action類的相應(yīng)屬性放到ValueStack對(duì)象的頂層節(jié)點(diǎn)(ValueStack對(duì)象相當(dāng)于一個(gè)棧)。
在Action中獲得ValueStack對(duì)象:
ActionContext.getContext().getValueStack()1、Top語(yǔ)法
使用Top獲取值棧中的第二個(gè)對(duì)象:
<s:property value="[1].top.對(duì)象"/>2、 N語(yǔ)法
使用N獲取值棧中的第二個(gè)對(duì)象:
<s:property value="[1].對(duì)象"/>3、@語(yǔ)法
調(diào)用action中的靜態(tài)方法:<s:property value="@vs1@靜態(tài)方法"/> (vs1:值棧 1,表示第一個(gè))。
總結(jié)
- 上一篇: 【struts2】struts2的一些常
- 下一篇: OGNL使用方法总结