- Java EE框架開發技術與案例教程
- 張繼軍 董衛
- 1354字
- 2020-05-28 14:20:34
4.2 Struts 2的OGNL表達式與應用案例
OGNL是Object-Graph Navigation Language的縮寫,是一種功能強大的表達式語言。通過簡單的表達式語法,可以存取對象的任意屬性值,也可以調用對象的方法等功能。OGNL通常與Struts 2標簽綁定使用。
提示:OGNL表達式類似于EL表達式,其使用方式也類似。
在JSP頁面上可以利用OGNL訪問到值棧(ValueStack)里的對象屬性。若希望訪問值棧中ContextMap中的數據,需要給OGNL表達式加上一個前綴字符#,如果沒有前綴字符#,搜索將在ObjectStack中進行。
1.讀取ObjectStack里的對象的屬性
若想訪問Object Stack里的某個對象的屬性,可以使用以下幾種形式之一。
object.propertyName或object['propertyName']或object["propertyName"]
【例4-1】本例展示了Struts 2是如何存儲數據,以及如何訪問數據的。
首先定義一個模型Person,然后在Action中定義、創建其對象并賦值,最后在頁面中顯示該對象的值。
1)設計模型類Person,其代碼如下。
package com.edu.ognl.action; import java.util.Date; public class Person { private String name; private int age; private Date birthday; public Person() {} public Person(String name, int age, Date birthday) { this.name = name; this.age = age; this.birthday = birthday; } //省略了getter/setter方法 }
2)設計Action,并配置Action,其代碼如下。

3)設計顯示信息的JSP頁面(showognl.jsp),其代碼如下。

4)啟動服務器,并在地址欄中輸入下列網址。

其運行界面如圖4-2所示。

圖4-2 【例4-1】的運行界面
2.讀取ContextMap里的對象的屬性
若訪問ContextMap里某個對象的屬性,需要給表達式加上一個前綴字符#,其訪問形式可以是下列形式之一。
#object.propertyName或 #object['propertyName']或 #object["propertyName"]
【例4-2】在Action中,給Web對象request、session和application等提供值,然后在頁面中獲取并顯示。
【設計與實現】
1)設計Action: OgnlAction,并采用注釋配置Action,其代碼如下。
package com.edu.ognl.action; //省略了import; @Namespace("/test") @ParentPackage("struts-default") @Results({ @Result(name = "success", location = "/showognl.jsp")}) public class OgnlAction extends ActionSupport { @Action("ognlTest") public String ognlTest() throws Exception { // 獲得ActionContext實例,以便訪問Servlet API ActionContext ctx = ActionContext.getContext(); ctx.getApplication().put("msg", "application信息"); //存入到application ctx.getSession().put("msg", "seesion信息"); //保存到session HttpServletRequest request = ServletActionContext.getRequest(); //獲取request對象 request.setAttribute("msg", "request信息"); // 保存到request return SUCCESS; } }
2)設計顯示信息的JSP頁面(showognl.jsp),其代碼如下。

3)啟動服務器,并在地址欄中輸入下列網址。

其運行界面如圖4-3所示。

圖4-3 【例4-2】的運行界面
3.訪問數組、List和Map類型的屬性
利用OGNL可以訪問集合(例如,List對象、Map對象或數組對象)類型對象中的數據元素。
(1)訪問數組和List類型的對象
對數組對象和List類型對象的訪問,其訪問格式是一樣的,都是使用從零開始的數字索引的形式,同時也可以調用數組和List類型對象上的方法。
OGNL中使用List對象格式如下。
{e1, e2, e3, …}
該表達式直接生成一個List對象,該List對象中包含:e1、e2、e3…等元素。
(2)訪問Map類型對象
訪問Map類型對象中的對象時需要將Map中的key作為索引或者將key作為屬性的方式訪問,將返回與該key所對應的value。
OGNL中使用Map對象格式如下。
#{key1:value1, key2:value2, key3:value3, …}
(3)OGNL集合可以使用in和not in判定元素是否屬于該集合
● in:表達式用來判斷某個元素是否在指定的集合對象中。
● not in:用于判斷某個元素是否不在指定的集合對象中。
例如,基于Struts 2標簽,利用OGNL運算,判斷元素a是否屬于集合{'a', 'b'}。
<s:if test="'a' in {'a', 'b'}">…</s:if>
(4)OGNL還可以使用某些規則獲取集合對象的子集
常用的相關操作如下。
● ? :用于獲取多個符合邏輯的元素。
● ∧:用于獲取符合邏輯的第一個元素。
● $:用于獲取符合邏輯的最后一個元素。
如下面的代碼所示。
Student.sex{? #this.sex= ='male'}//獲取Student的所有male的sex集合
【例4-3】本例展示了如何創建Map和List對象,并顯示其信息。設計一個JSP頁面,在該頁面內生成OGNL的Map和List對象,并顯示其信息。
【設計與實現】
1)設計的JSP頁面,其代碼如下。

2)啟動服務器,并在地址欄中輸入下列網址。
http://localhost:8080/c4_ognl_tag/showognl.jsp
其運行界面如圖4-4所示。

圖4-4 【例4-3】的運行界面
- Raspberry Pi for Python Programmers Cookbook(Second Edition)
- GAE編程指南
- Python數據分析基礎
- jQuery EasyUI網站開發實戰
- Learning C++ Functional Programming
- Podman實戰
- Java應用開發技術實例教程
- Windows Server 2016 Automation with PowerShell Cookbook(Second Edition)
- WebRTC技術詳解:從0到1構建多人視頻會議系統
- 蘋果的產品設計之道:創建優秀產品、服務和用戶體驗的七個原則
- Getting Started with React Native
- Java程序設計與項目案例教程
- Python從入門到精通(第3版)
- 從0到1:HTML5 Canvas動畫開發
- OpenCV with Python Blueprints