在Java的Struts架構中ONGL運算式的基礎使用入門_java

來源:互聯網
上載者:User

首先瞭解下OGNL的概念:
OGNL是Object-Graph Navigation Language的縮寫,全稱為對象圖導航語言,是一種功能強大的運算式語言,它通過簡單一致的文法,可以任意存取對象的屬性或者調用對象的方法,能夠遍曆整個對象的結構圖,實現對象屬性類型的轉換等功能。

此外,還得先需弄懂OGNL的一些知識:
1.OGNL運算式的計算是圍繞OGNL上下文進行的。
OGNL上下文實際上就是一個Map對象,由ognl.OgnlContext類表示。它裡面可以存放很多個JavaBean對象。它有一個上下文根對象。
上下文中的根對象可以直接使用名來訪問或直接使用它的屬性名稱訪問它的屬性值。否則要加首碼“#key”。

2.Struts2的標籤庫都是使用OGNL運算式來訪問ActionContext中的對象資料的。如:<s:propertyvalue="xxx"/>。

3.Struts2將ActionContext設定為OGNL上下文,並將值棧作為OGNL的根對象放置到ActionContext中。

4.值棧(ValueStack) :
可以在值棧中放入、刪除、查詢對象。訪問值棧中的對象不用“#”。
Struts2總是把當前Action執行個體放置在棧頂。所以在OGNL中引用Action中的屬性也可以省略“#”。

5.調用ActionContext的put(key,value)放入的資料,需要使用#訪問。


OGNL中重要的3個符號:#、%、$:
#、%和$符號在OGNL運算式中經常出現,而這三種符號也是開發人員不容易掌握和理解的部分,需要時間的積累才漸漸弄清楚……
1.#符號
#符號的用途一般有三種。

訪問非根對象屬性,例如#session.msg運算式,由於Struts 2中值棧被視為根對象,所以訪問其他非根對象時,需要加#首碼。實際上,#相當於ActionContext. getContext();#session.msg運算式相當於ActionContext.getContext().getSession(). getAttribute("msg") 。

用於過濾和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。

用來構造Map,例如樣本中的#{'foo1':'bar1', 'foo2':'bar2'}。

2.%符號
%符號的用途是在標誌的屬性為字串類型時,計算OGNL運算式的值,這個類似js中的eval,很暴力。
3.$符號
$符號主要有兩個方面的用途。

在國際化資源檔中,引用OGNL運算式,例如國際化資源檔中的代碼:reg.agerange=國際化資源資訊:年齡必須在${min}同${max}之間。

在Struts 2架構的設定檔中引用OGNL運算式,例如:

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

 

樣本:第一個OGNL程式

public class OGNL1 {   public static void main(String[] args)   {     /* 建立一個Person對象 */     Person person = new Person();     person.setName("zhangsan");          try     {       /* 從person對象中擷取name屬性的值 */       Object value = Ognl.getValue("name", person);        System.out.println(value);     }     catch (OgnlException e)     {       e.printStackTrace();     }   } }  class Person {   private String name;    public String getName()   {     return name;   }    public void setName(String name)   {     this.name = name;   } } 

控制台輸出:

zhangsan

可以看到我們正確的取得了person對象的name屬性值,該getValue聲明如下:

public static <T> T getValue(String expression,Object root)throws OgnlException  Convenience method that combines calls to parseExpression and getValue.   Parameters: expression - the OGNL expression to be parsed root - the root object for the OGNL expression  Returns: the result of evaluating the expression 

OGNL會根據運算式從根對象(root)中提取值。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.