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測試