struts2 Ognl關鍵概念

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>

發佈了36 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章