日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OGNL基础

發布時間:2024/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 required

struts.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,表示第一個)。

總結

以上是生活随笔為你收集整理的OGNL基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。