OGNL基础
OGNL是Object-Graph Navigation Language的縮寫,全稱為對象圖導航語言,是一種功能強大的表達式語言,它通過簡單一致的語法,可以任意存取對象的屬性或者調用對象的方法,能夠遍歷整個對象的結構圖,實現對象屬性類型的轉換等功能。
struts2標簽中使用OGNL語言,這是一種類似于EL表達式、但是比EL表達式功能強大的多的語言。但是相對于其它的表達式語言如EL等,OGNL有自己的優點:
1、能夠訪問對象的方法,例如list.size();
2、能夠訪問靜態屬性與靜態方法,方法是在類名前和方法前加上@。如@java.lang.Math@PI,@java.lang.String@format(‘foo%s’,’bar’);
3、支持賦值操作和表達式串聯,如賦值#value=5;
4、訪問OGNL上下文(OGNL context)和ActionContext(所有的servlet資源);
5、操作集合類對象。
在深入學習OGNL之前,先了解一些重要的OGNL的基本知識:
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)放入的數據,需要使用#訪問。
OGNL語法類似于EL,主要使用“ . ”作為操作符。例如要訪問person.getCountry().getName()可以這樣寫:person.country.name。在訪問POJO屬性上,OGNL與EL表達式是完全一樣的。OGNL主要有3個符號:#、 %、$,下面依次給出這3種符號的具體用法:
一、“#”聲明OGNL表達式
“#”是struts2標簽中最常用的符號。主要有三種用途:
1、訪問非根對象(即OGNL上下為與ActionContext資源,OGNL的根對象是值棧)屬性,例如#session.msg表達式,由于Struts2中值棧被視為根對象,所以訪問其他非根對象時,需要加#前綴。實際上,#相當于ActionContext.getContext();#session.msg表達式相當于ActionContext.getContext().getSession(). getAttribute(“msg”) 。
常用的“#”屬性見下表:
2、用于過濾或篩選集合,例如:books.{?#this.price<20},表示所有的price<20的書。
3、構造Map,如#{'foo1':'bar1','foo2':'bar2'}。
二、“%”顯式聲明OGNL表達式
“%”類似于javascript中的eval,用途:在標識屬性為字符串類型的同時計算OGNL表達式的值。某些標簽中既能接受字符串,又能接受OGNL表達式,這時候,標有“%”的被當作OGNL表達式并被執行,沒有標”%“的被當作普通字符串。例如:
<!-- 參數為普通字符串--> <struts:label label="#request.account"></struts:label><!-- 用%表示參數為OGNL表達式--> <struts:label label="%{#request.account}"></struts:label>第一行代碼會輸出字符串#request.account,而第二行會輸出request的account屬性。
三、“$”在資源文件中引用OGNL表達式
$主要用于在資源國際化文件中或者在struts.xml中引用OGNL表達式。
Resources.properties
validation.require=${getText(fieldName)} is requiredstruts.xml
<action name="AddPhoto" class="addPhoto"> <!-- 配置action --><result type="redirect">ListPhotos.action?albumId=${albumId}</result> <!-- 重定向結果 --> </action>附注:
值棧
ValueStack對象。這個對象貫穿整個Action的生命周期(每個Action類的對象實例會擁有一個ValueStack對象)。當Struts 2接收到一個.action的請求后,會先建立Action類的對象實例,但并不會調用Action方法,而是先將Action類的相應屬性放到ValueStack對象的頂層節點(ValueStack對象相當于一個棧)。
在Action中獲得ValueStack對象:
ActionContext.getContext().getValueStack()1、Top語法
使用Top獲取值棧中的第二個對象:
<s:property value="[1].top.對象"/>2、 N語法
使用N獲取值棧中的第二個對象:
<s:property value="[1].對象"/>3、@語法
調用action中的靜態方法:<s:property value="@vs1@靜態方法"/> (vs1:值棧 1,表示第一個)。
總結
- 上一篇: 【struts2】struts2的一些常
- 下一篇: OGNL使用方法总结