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)" />