1. 程式人生 > >OGNL物件導航語言

OGNL物件導航語言

OGNL是Struts2中使用的一種表示式語言,它可以用於JSP的標籤庫中,以便能夠方便的訪問各種物件的屬性;它用於介面將引數傳遞到Action(並進行型別轉換)中;它還可以用於struts2的配置檔案中!所以,非常有必要理解OGNL的基本機制。

OGNL稱為物件圖導航語言。所謂物件圖,即以任意一個物件為根,通過OGNL可以訪問與這個物件關聯的其它物件。如:

package cn.com.leadfar.struts2.actions;

publicclass User {

private Stringusername;

private Groupgroup;

public String getUsername() {

returnusername;

   }

publicvoid setUsername(String username) {

this.username = username;

   }

public Group getGroup() {

returngroup;

   }

publicvoid setGroup(Group group) {

this.group = group;

   }

}

package cn.com.leadfar.struts2.actions;

publicclass Group {

private Stringname;

private Organization

org;

public String getName() {

returnname;

   }

publicvoid setName(String name) {

this.name = name;

   }

public Organization getOrg() {

returnorg;

   }

publicvoid setOrg(Organization org) {

this.org = org;

   }

}

package cn.com.leadfar.struts2.actions;

publicclass Organization {

private String

orgId;

public String getOrgId() {

returnorgId;

   }

publicvoid setOrgId(String orgId) {

this.orgId = orgId;

   }

}

上面三個類,描述了通過一個User物件,可以導航到Group物件,進而導航到Organization物件,以User物件為根,一個物件圖如下所示:

User(root)

  -- username

  -- group

     -- name

     -- org

        -- orgId

在真實的環境下,這個物件圖可能會極其複雜,但是通過基本的getters方法,都應該能夠訪問到某個物件的其它關聯物件。【物件圖的導航,必須通過getters方法進行導航】

下述程式碼將建立一個User物件,及其相關的一系列物件:

      User user = new User();

      Group g = new Group();

      Organization o = new Organization();

       o.setOrgId("ORGID");

      g.setOrg(o);

      user.setGroup(g);

如果通過Java程式碼來進行導航(依賴於getters方法),導航到Organization的orgId屬性,如下所示:

//JAVA來導航訪問

user.getGroup().getOrg().getOrgId();

【注意:導航的目的,是為了獲取某個物件的值或設定某個物件的值或呼叫某個物件的方法!】

【注意:OGNL表示式語言的真正目的,是為了在那些不能寫JAVA程式碼的地方執行JAVA程式碼,或者是為了更方便地執行JAVA程式碼】

利用OGNL進行導航的程式碼如下:

//利用OGNL表示式訪問

      String value = (String)Ognl.getValue("group.org.orgId", user);

Ognl.getValue()方法的第一個引數,就是一條OGNL表示式,第二個引數是指定在表示式中需要用到的root物件!

完整程式碼如下:

publicvoid testOgnl01()throws Exception{

      User user = new User();

      user.setUsername("張三");

//利用OGNL表示式訪問user物件的username屬性

      String value = (String)Ognl.getValue("username", user);

      log(value);

   }

publicvoid testOgnl02()throws Exception{

      User user = new User();

      Group g = new Group();

      Organization o = new Organization();

      o.setOrgId("ORGID");

      g.setOrg(o);

      user.setGroup(g);

//JAVA來導航訪問

      log(user.getGroup().getOrg().getOrgId());

//利用OGNL表示式訪問

      String value = (String)Ognl.getValue("group.org.orgId", user);

      log(value);

   }

publicvoid testOgnl03()throws Exception{

      User user = new User();

      Group g = new Group();

      Organization o = new Organization();

      o.setOrgId("ORGID");

      g.setOrg(o);

      user.setGroup(g);

//JAVA來導航訪問

      log(user.getGroup().getOrg().getOrgId());

//也可以在表示式中使用#root來代表root物件

      String value = (String)Ognl.getValue("#root.group.org.orgId", user);

      log(value);

   }

privatevoid log(Object o){

      System.out.println(o);

   }

在OGNL的表示式中,有可能需要訪問到多個毫不相干的物件,這時候,我們需要給OGNL傳遞一個Map型別的物件,把表示式中需要用到的物件放到Map中即可!這個Map物件,稱為context。

要在表示式中訪問到context中的物件,需要使用“#物件名稱”的語法規則。

如:

publicvoid testOgnl04()throws Exception{

      User user = new User();

      user.setUsername("張三");

      Group g = new Group();

      Organization o = new Organization();

      o.setOrgId("ORGID");

      g.setOrg(o);

      user.setGroup(g);

      User user2 = new User();

      user2.setUsername("李四");

/**

*所謂context其實就是一個Map型別的物件。主要是因為在OGNL中,不支援多個root物件,那麼

*如果需要在表示式中訪問更多毫不相干的物件時,只能通過一個Map來把這些物件統一傳遞給OGNL

*/

      Map context = new HashMap();

      context.put("u1", user);

      context.put("u2", user2);

//在表示式中需通過“#+物件的名稱來訪問context中的物件

//如果表示式中沒有用到root物件,那麼可以用任意一個物件代表root物件!

      String value = (String)Ognl.getValue("#u1.username + ',' + #u2.username", context,new Object());

      log(value);

   }

publicvoid testOgnl05()throws Exception{

      User user = new User();

      user.setUsername("張三");

      Group g = new Group();

      Organization o = new Organization();

      o.setOrgId("ORGID");

      g.setOrg(o);

      user.setGroup(g);

      User user2 = new User();

user2.setUsername("李四");

      User user3 = new User();

user3.setUsername("王五");

      Map context = new HashMap();

      context.put("u1", user);

      context.put("u2", user2);

//OGNL傳遞root物件及context物件以便解釋對應的表示式

String value = (String)Ognl.getValue("#u1.username + ',' + #u2.username + ',' + username", context,user3);

      log(value);

   }

OGNL表示式也可以用於賦值操作。

publicvoid testOgnl06()throws Exception{

      User user = new User();

//呼叫setValue()方法來進行賦值

//第一個引數:OGNL表示式

//第二個引數:root物件

//第三個引數:要賦的值

      Ognl.setValue("username", user,"張三");

      log(user.getUsername());

   }

publicvoid testOgnl07()throws Exception{

      User user = new User();

      Map context = new HashMap();

      context.put("u", user);

//呼叫setValue()方法來進行賦值

//第一個引數:OGNL表示式

//第二個引數:context物件

//第三個引數:root物件

//第四個引數:要賦的值

      Ognl.setValue("#u.username", context,new Object(),"張三");

      log(user.getUsername());

   }

publicvoid testOgnl08()throws Exception{

      User user = new User();

      Map context = new HashMap();

      context.put("u", user);

//利用賦值符號"="來進行賦值

      Ognl.getValue("#u.username = '李四'", context, new Object());

      log(user.getUsername());

   }

publicvoid testOgnl09()throws Exception{

      User user1 = new User();

      User user2 = new User();

      Map context = new HashMap();

context.put("u1", user1);

      context.put("u2", user2);

//在一個表示式中可以用逗號分隔,同時執行多個表示式

      Ognl.getValue("#u1.username = '李四',#u2.username='王五'", context, new Object());

log(user1.getUsername());

      log(user2.getUsername());

}

//************************* OGNL呼叫物件的方法 *****************************//

publicvoid testOgnl10()throws Exception{

      User user = new User();

//如果是呼叫root物件的方法,可以直接使用方法的名稱來呼叫方法

      Integer value = (Integer)Ognl.getValue("addSomething(1,1)", user);

      log(value);

   }

publicvoid testOgnl11()throws Exception{

User user =new User();

      user.setUsername("李四");

//如果是呼叫root物件的方法,可以直接使用方法的名稱來呼叫方法

      String value = (String)Ognl.getValue("getUsername()", user);

      log(value);

   }

publicvoid testOgnl12()throws Exception{

User user =new User();

      Ognl.getValue("setUsername('王五')", user);

      String value = (String)Ognl.getValue("getUsername()", user);

      log(value);

   }

//************************* OGNL呼叫靜態方法和變數 *********************//

publicvoid testOgnl13()throws Exception{

      User user = new User();

      user.setUsername("王五");

//呼叫靜態變數

//注意:outSystem中的靜態變數,outPrintStream型別的一個物件

//println()則是out這個物件中的例項方法(不是靜態方法)

//呼叫靜態方法,需要在類名和變數名前面加上@來呼叫,對於例項方法,用"."來呼叫

Ognl.getValue("@[email protected](username)", user);

}

publicvoid testOgnl14()throws Exception{

      User user = new User();

      user.setUsername("wangwu");

//呼叫靜態方法,注意使用全路徑類名

       Ognl.getValue("@[email protected](@[email protected](username))", user);

   }

publicvoid testOgnl15()throws Exception{

      Object root = new Object();

      Map context = new HashMap();

//利用OGNL建立java.util.List物件

      List list = (List)Ognl.getValue("{123,'xxx','kdjfk'}", context, root);

      context.put("list", list);

//利用OGNL建立陣列

int[] intarray = (int[])Ognl.getValue("new int[]{23,45,67}", context, root);

      context.put("intarray", intarray);

//利用OGNL表示式建立java.util.Map物件

      Map mapvalue = (Map)Ognl.getValue("#{'listvalue':#list,'intvalue':#intarray}", context, root);

      context.put("mapvalue", mapvalue);

//利用OGNL表示式訪問這些陣列和集合物件

      Ognl.getValue("@[email protected](#list[1])", context,root);

      Ognl.getValue("@[email protected](#intarray[2])", context,root);

      Ognl.getValue("@[email protected](#mapvalue.listvalue[0])", context,root);

      Ognl.getValue("@[email protected](#mapvalue['intvalue'][0])", context,root);

   }

publicvoid testOgnl16()throws Exception{

      List root = new ArrayList();

      User user1 = new User();

      user1.setUsername("張三");

      User user2 = new User();

      user2.setUsername("李四");

      root.add(user1);

      root.add(user2);

//如果root物件是List型別

      log(Ognl.getValue("#root[0].username", root));

      log(Ognl.getValue("#root[1].username", root));

   }

相關推薦

OGNL物件導航語言

OGNL是Struts2中使用的一種表示式語言,它可以用於JSP的標籤庫中,以便能夠方便的訪問各種物件的屬性;它用於介面將引數傳遞到Action(並進行型別轉換)中;它還可以用於struts2的配置檔案中!所以,非常有必要理解OGNL的基本機制。 OGNL稱為物件圖導航

OGNL——物件導航語言,強大的表示式語言

OGNL 1.1 OGNL的全稱是Object Graph Navigation Language(物件圖導航語言),它是一種強大的表示式語言 1.2 OgnlContext(ongl上下文)其實就是Map (教室、老師、學生) OgnlContext=根物件(1)+非根物件(N)

OGNL(Object Graph Navigation Language)物件導航語言

1.1 OGNL的全稱是Object Graph Navigation Language(物件圖導航語言),它是一種強大的表示式語言 1.2 OgnlContext(ongl上下文)其實就是Map (教室、老師、學生) OgnlContext=根物件(1)+

OGNL的全稱是對象圖導航語言

字符串 表達 struts sco avi 路徑 expr object ESS OGNL的全稱是對象圖導航語言( object-graph Navigation Language),它是一種功能強大的開源表達式語言,使用這種表達式語言,可以通過某種表達式語法,存取Java

第八天:物件導航語言

1、Strust 取值                            EL 取值 #attr.age                                                                                   

Hibernate查詢方式、物件導航查詢、OID查詢、HQL查詢、QBC、元素SQL

-》物件導航查詢         通過企業Id,查詢到企業,然後根據這個企業查詢所有的員工 測試類: package test; import java.util.Iterator; import java.util.List; import junit.fram

Hibernate中的各種查詢(物件導航、OID、hql、QBC、本地SQL、多表)

Hibernate中的查詢方式 1、物件導航查詢 (1)根據id查詢某個客戶(Customer),然後再查詢這個客戶中的所有聯絡人(Linkman) //查詢id為1的客戶以及這個客戶中的所有聯絡人 Customer c1 = session.get(Customer.cla

BeanShell(物件指令碼語言)

BeanShell使用背景:公司的抓取管理平臺,公司的產品人員每天都需要對各個地方的運營商網站看一些違規,投訴,公告等資訊進行監控,為了保證產品人員不必要每天都上各個網站上看資訊,所以針對內部需求,我們採用抓取策略,用程式模擬登入每一個網站,然後對我們要的資訊,如公告資訊進行

設計一種面向物件指令碼語言

有沒有感覺設計一門語言實在是太有意思了,可以自定義語法規則,我的“地盤聽我的”。 指令碼語言的功能 本書設計一門純粹的面向物件指令碼語言,任何語言都有個名詞,這裡給這個語言起個名字——sparrow(麻雀)。它支援的功能如下。 1 變數 支援區域性變數和區域性變數的定

JavaWeb框架_Struts2_(四)----->表達式語言OGNL

轉化 ans 功能 元素 oba const mage 引用 font 1. 表達式語言OGNL OGNL簡介 OGNL基本語法 常量 操作符 OGNL表達式 OGNL基礎 OGNL上下文 OGNL值棧 OGNL的訪問

3.Java面向物件程式設計OOA/OOP/OOD/OOAD()/UML類圖、函數語言程式設計Scala(JVM)---類與物件、封裝繼承多型、構造方法、覆寫/重寫/override

一、緒論 1.面向物件程式設計正規化(C++、Java、Go)------能進行現實生活的抽象。             每個物件都是一個類。類中包含屬性與方法。 OOA:面向物件分析 OOP:面向物件程式設計

《面向物件程式設計——C++語言描述》學習筆記(二)

第二章 從C到C++  2.1main函式 1.C++中需要寫int main()不能只是main() 2.main()函式裡面最後有一個return 0; 3.main()被啟動程式碼呼叫,而啟動程式碼是編譯器新增到程式中的,是程式和作業系統的橋樑。 4.C++中main()中

清華大學《C++語言程式設計基礎》線上課程筆記05---vector物件物件的複製與移動,string類

vector 物件 C++標準庫中的一個類模板 封裝任何型別的動態陣列,自動建立和刪除。 陣列下標越界檢查。 將動態陣列封裝成類的知識點中封裝的ArrayOfPoints也提供了類似功能,但只適用於一種型別的陣列。 vector<元素型別> 陣列物件名(陣列長度

【學習筆記】 唐大仕—Java程式設計 第5講 深入理解Java語言之5.3 物件構造與初始化

物件構造與初始化 構造方法 構造方法(constructor) 物件都有構造方法 如果沒有,編譯器加一個default構造方法 抽象類(abstract)有沒有構造方法? 答案:抽象類也有構造方法。實際上,任何類都有自己的構造方法

【學習筆記】 唐大仕—Java程式設計 第5講 深入理解Java語言之5.4 物件清除與垃圾回收

/** * 物件清除與垃圾回收 * @author cnRicky * @date 2018.11.10 */ 物件清除與垃圾回收 物件清除 我們知道:new建立物件 那麼如何銷燬物件? Java中是自動清除 不需要使用delete等方法人為銷燬它

第21講 struts2值棧OGNL訪問JavaBean,List集合 Map物件

一,OGNL訪問JavaBean 1在專案HeadFirstStruts2chapter04 ,新建com.cruise.model包,Student類,name age屬性,全參構造和無參構造,package com.cruise.model;public class 

面嚮物件語言的三大特徵

面嚮物件語言的三大特徵是:封裝 繼承 多型 最近感覺,總結一下這個問題還是挺有必要的,所以轉發了此篇文章的部分段落。   封裝   封裝是面向物件的特徵之一,是物件和類概念的主要特性。封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的

go語言初體驗(流程控制、range遍歷、函式、結構體、面向物件

一、流程控制 // main package main import ( "fmt" ) func main() { x := 2 switch x { case 1: fmt.Print("beifeng 1") case 2:

快樂程式設計大本營【java語言訓練班】 6課:用java的物件和類程式設計

快樂程式設計大本營【java語言訓練班】 6課:用java的物件和類程式設計 第1節. 什麼是物件和類 第2節. 物件的屬性和方法 第3節. 類的繼承 第4節. 使用舉例:建立類,定義方法,定義屬性 第5節. 使用舉例:建立物件,屬性賦值與使用,方法呼叫; 第6節. 使用舉例:類繼承及物件使用 地址如下

C語言到C++ 物件和類的進一步學習2

1.淺拷貝 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Name { public: Name(const char *myp) { len = strle