OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
headline.parent<-root object
ensureLoaded()被root object调用,然后set/get name property。
5,Maps
可以这样创建一个Map:
#{“foo”: “foo value”, “bar”: “bar value” }
#@java.util.LinkedHashMap@{“foo”: “foo value”, “bar”: “bar value” }
6,Projecting Across Collections
从一个Collection中的每一个元素里提取或调用相同的方法或property,然后将结果储存为一个新的collection,称为projection。
Listeners.{delegate} 返回一个List,这个List是listeners中所有delegate的集合。
Objects.{#this instanceof String ? #this : #this.toString} 创建一个新的List,并将Object List中所有元素转换为String,存入新的List。
7,检查List的第一和最后一个元素。
Listeners.{?ture}[0] 这样可以检测,但是如果是一个空List,就会发生ArrayIndexOutOfBoundsException。为防止这种情况,可以用下面方式检测第一个和最后一个元素:
Objects.{^#this instanceof String} 第一个元素
Objects.{$#this instanceof String} 最后一个元素
8,调用静态方法
@Class@method(args)
如果Class不指明,默认为java.lang.Math
也可以用实例化的方式来调用静态方法。
同样,调用静态成员变量的方法为:@Class@field
9,#fact(30H) <-注意与#fact.(30H)的区别。
如果一个OGNL表达式在括号前没有逗号,那么OGNL会把第一表达式的结果作为另一个表达式来赋值,而括号中表达式的结果会作为root object指向那个表达式。
如:#fact(30H) <- 查找fact 变量,将这个变量解析为一个OGNL表达式,使用30H作为该表达式的root object。
fact(30H) <-令人混淆的用法,OGNL可能会将其作为一个方法调用。
(fact)(30H) <-调用fact方法。
10,虚拟Lambda表达式(Pseudo-Lambda Expression)
OGNL有一个简化的Lambda表达式句法,能够让你写一些简单功能。需要注意的是,所有OGNL变量是全局范围的。
如:#fact=:[#this<=1 ? 1 : #this*#fact(#this-1)],#fact(30H)
这是一个OGNL表达式,声明一个递归功能函数,然后调用它。[]中的是Lambda表达式, #this变量指向的是初始化30H的表达式。OGNL将Lambda表达式作为常量来处理。Lambda表达式的值是一个OGNL使用的AST。
11, 虚拟 Properties集合(Pseudo-Properties)
OGNL将集合中的一些特殊Properties变为可利用,因为集合并不遵循JavaBean模式的命名规则。
Collection
|
Special Properties
|
Collection (被
Map,List,Set继承
)
|
Size
isEmpty
|
List
|
iterator
|
Map
|
keys
values
注意:这些
properties附加
size 和
isEmpty,不同于索引形式访问
Maps, 如
someMap[“size”]从
Map中获得
“size”key,而
someMap.
size得到
Map的大小
|
Set
|
iterator
|
Iterater
|
naxt
hasNext
|
Enumeration
|
next
hasNext
nextElemet
hasMoreElement
|
所有其它objects被处理为单独的collections,包括它们自己。