Ognl三要素
1.表達式(Expression) ,表示幹什麼
2.根對象(Root Object),表示對誰幹
3.上下文環境(Context),表示在哪幹
Ognl表達式的常用形式
1. 基本對象樹的訪問
對象樹的訪問就是通過使用點號將對象的引用串聯起來進行。
例如:name,department.name,user.department.factory.manager.name
2. 對容器變量的訪問
對容器變量的訪問,通過#符號加上表達式進行。
例如:#name,#department.name,#user.department.factory.manager.name
3. 使用操作符號
OGNL表達式中能使用的操作符基本跟Java裏的操作符一樣,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,還能使用 mod, in, not in等。
4. 容器、數組、對象
OGNL支持對數組和ArrayList等容器的順序訪問:
例如:group.users[0]
同時,OGNL支持對Map的按鍵值查找:
例如:#session['mySessionPropKey']
不僅如此,OGNL還支持容器的構造的表達式:
例如:{"green", "red", "blue"}構造一個List,#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}構造一個Map
你也可以通過任意類對象的構造函數進行對象新建:
例如:new java.net.URL("http://localhost/")
5. 對靜態方法或變量的訪問
要引用類的靜態方法和字段,他們的表達方式是一樣的@class@member或者@class@method(args):
例如:@com.javaeye.core.Resource@ENABLE,@com.javaeye.core.Resource@getAllResources
6. 方法調用
直接通過類似Java的方法調用方式進行,你甚至可以傳遞參數:
例如:user.getName(),group.users.size(),group.containsUser(#requestUser)
7. 投影和選擇
OGNL支持類似數據庫中的投影(projection) 和選擇(selection)。
投影就是選出集合中每個元素的相同屬性組成新的集合,類似於關係數據庫的字段操作。投影操作語法爲 collection.{XXX},其中XXX 是這個集合中每個元素的公共屬性。
例如:group.userList.{username}將獲得某個group中的所有user的name的列表。
選擇就是過濾滿足selection 條件的集合元素,類似於關係數據庫的紀錄操作。選擇操作的語法爲:collection.{X YYY},其中X 是一個選擇操作符,後面則是選擇用的邏輯表達式。而選擇操作符有三種:
? 選擇滿足條件的所有元素
^ 選擇滿足條件的第一個元素
$ 選擇滿足條件的最後一個元素
例如:group.userList.{? #this.name != null}將獲得某個group中user的name不爲空的user的列表。
this指針
OGNL表達式是以點進行串聯的一個字符串鏈式表達式。而這個表達式在進行計算的時候,從左到右,每一次表達式計算返回的結果成爲當前對象,並繼續進行計算,直到得到計算結果。每次計算的中間對象都會放在一個叫做this的變量裏面這個this變量就稱之爲this指針。
例如:group.userList.size().(#this+1).toString()
在這個例子中,#this其實就是group.userList.size()的計算結果。
Ognl在jsp頁面中,#,%,$使用方法
#用法
1. 訪問OGNL上下文和Action上下文,#相當於ActionContext.getContext();下表有幾個ActionContext中有用的屬性:
名稱 |
作用 |
例子 |
parameters |
包含當前HTTP請求參數的Map |
#parameters.id[0]作用相當於request.getParameter("id") |
request |
包含當前HttpServletRequest的屬性(attribute)的Map |
#request.userName相當於request.getAttribute("userName") |
session |
包含當前HttpSession的屬性(attribute)的Map |
#session.userName相當於session.getAttribute("userName") |
application |
包含當前應用的ServletContext的屬性(attribute)的Map |
#application.userName相當於application.getAttribute("userName") |
attr |
用於按request > session > application順序訪問其屬性(attribute) |
#attr.userName相當於按順序在以上三個範圍(scope)內讀取userName屬性,直到找到爲止 |
2. 用於過濾和投影(projecting)集合,如books.{?#this.price<100};
3. 構造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
%用法,計算表達式的值(用法見例子)
$用法
1. 用於在國際化資源文件中,引用OGNL表達式
2. 在Struts 2配置文件中,引用OGNL表達式(可用來在Action之間傳值),如
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>
3.在Struts 2框架的驗證文件中引用OGNL表達式
4.<validators>
<field name=”intb”>
<field-validator type=”int”>
<param name=”min”>10</param>
<param name=”max”>100</param>
<message>BAction-test校驗:數字必須爲${min}爲${max}之間!</message>
</field-validator>
</field>
</validators>