JSTL中的EL语言是个灾难,很难想象一个EL表达式不能去取复杂的属性还不支持显示的方法调用,类似list.get(20).getName(locale)。而且这个灾难还非常流行,唉。

幸好OGNL很好的解决了这个问题,而且在Tapestry,Webwork等框架下均已经内嵌了支持。

表达式分类:
1. 访问属性:如,user.name
2. 访问接口/方法:如,user.verify()
3. 数组游标,如:users[2]

常量:
字符串、字符:一般使用单引号,也可以使用双引号,支持所有的转义字符
数值:可以使用B表示BigDecimal,H表示BigInteger(不是十六进制)
布尔:true或者false关键字
空指针:null关键字

访问属性:
user.name

索引位置:
OGNL提供了一个很有趣的例子:array["length"],其中array作为根对象,调用其length方法是采用字符串的形式来进行的,等同于array["len" + "gth"],当然等价array.length。

带索引的属性:
someProperty[2] 可以用来getSomeProperty(2) or setSomeProperty(2, value),查找顺序先找关联数组的方法,再找带索引参数的方法如下:
public PropertyType[] getPropertyName()
public void setPropertyName(PropertyType[] anArray)
public PropertyType getPropertyName(int index)
public void setPropertyName(int index, PropertyType value)

OGNl扩展的带索引的属性:
public PropertyType getPropertyName(IndexType index)
public void setPropertyName(IndexType index, PropertyType value)
比如:session.attribute("bar")

调用方法:
method( ensureLoaded(), name ),用逗号分隔参数,由于逗号在OGNL语言中有别的用处,所以在语法上需要小心。

变量引用:
使用#标注:#var = 99
this是OGNL语言中内置的对象,用来表示当前表达式的变量。listeners.size().(#this > 100? 2*#this : 20+#this)

括号:
method( (ensureLoaded(), name) )这个表达式是调用一个参数的method方法。

链接表达式:
再看一次method( (ensureLoaded(), name) )
其中ensureLoaded(), name的意思是:调用ensureLoaded方法,再调用#this.name,method方法的参数是name。

集合构建
{ null,"Untitled" }——说明:最好看成数组,因为集合一般不会支持空元素。

集合投射
listeners.{delegate}返回所有listener对象的delegate对象。
objects.{ #this instanceof String ? #this : #this.toString()}转变为字符串对象

集合选择:
listeners.{? #this instanceof ActionListener}——注意?的位置
返回单个对象,首个:objects.{^ #this instanceof String },最后一个:objects.{$ #this instanceof String }

创建对象:
需要显式的指定java package,如:new java.util.ArrayList()

静态方法、成员:
@class@method(args),@class@field,同样要指定class的全路径

表达式赋值:
如果是AST,OGNL直接解析,如果是其他对象,则将其转化对字符串交给AST解析。

简单的功能表达式:
如递归表达式:#fact = :[#this<=1? 1 : #this*#fact(#this-1)], #fact(30H)

集合的特殊属性
Collection:size, isEmpty
List:iterator
Map:keys, values
注意:someMap["size"]可能得到someMap中对应key为"size"的对象, 而someMap.size得到someMap的大小.
Set:iterator
Iterator:next,hasNext
Enumeration:next,hasNext,nextElement,hasMoreElements

与JAVA的不同之处
逗号:类似C的语法,逗号用于分割两个不同的表达式
花括号:用于创建list,元素可以为空
in和not in:用于集合的contains测试