輕量級JavaEE企業應用實戰(十三)

OGNL表達式

傳統的OGNL表達式求職中,系統會假設只有一個根對象;如果系統的Stack Context中包含兩個對象:foo對象,它在Context中的名字爲foo; bar對象,它在Context中的名字是bar,並將foo對象設置成Context的根對象

//返回foo.getBlah();方法返回值
#foo.blah
//返回bar.getBlah();
#bar.blah
//foo是根對象,默認是取得foo對象的blah屬性
#blah

通過索引訪問Stack Context中的對象

Stack Context包含兩個根實例:animal實例是棧頂元素,person實例在後

//animal.getName();
[0].name
//person.getName();
[1].name

Struts2使用標準的Context來進行OGNL表達式的求值,這個對象就是一個Map的實例類型,其根對象是ValueStack,可以通過以下方式獲取ValueStack裏的屬性

${bar}

OGNL中的集合操作

使用OGNL表達式可以直接創建集合

List : {e1, e2, e3}
Map : #{key1:value1, key2:value2}

OGNL表達式提供了兩個運算符:in、not in,in判斷某個元素是否在指定集合中;not in相反

示例:
<s:if test=" 'foo' in {'foo', 'bar'}">
    包含
</s:if>
<s:else>
    不包含
</s:else>

除此之外,OGNL還允許通過某個規則取得集合的子集。

? : 取出所有符合選擇邏輯的元素
^ : 取出符合選擇邏輯的第一個元素
$ : 取出符合邏輯的最後一個元素

person.relatives.{? #this.gender == 'male'}
意義:取出person的所有性別爲male的relatives(親戚)集合

訪問靜態成員

想要OGNL表達式訪問靜態成員
<constant name="struts.ognl.allowStaticMethodAccess"
   value="true" />

設置上邊的常量,OGNL表達式可以通過如下訪問靜態成員
@className@staticField
@className@staticMethod(val...)

在JSP頁面
<s:property value="@java.lang.System@getenv('JAVA_HOME')" />
<s:property value="@java.lang.Math@PI" />

Lambda表達式

OGNL表達式支持基本的Lambda表達式,可以使用一些簡單的函數

假設有下斐波那契數列
if n==0 return 0;
elseif n==1 return 1;
else return fib(n-2)+fib(n-1)

<s:property value="#fib =: [#this==0? 0: #this==1? 1:
  #fib(#this-2) + #fib(#this-1)], #fib(11)" />
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章