轻量级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)" />
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章