1. 程式人生 > >Struts2高級開發之OGNL

Struts2高級開發之OGNL

介紹 t對象 isempty 調用 其中 map obj width action

一、OGNL介紹

  OGNL是強大的表達式語言,能夠自動導航對象的結構並訪問和設置對象數據。在OGNL表達式中,核心對象為OGNL上下文,相當於一個Map容器。使用OGNL表達式語言,需要導入兩個包:ognl-3.0.jar、javassist-3.7.jar。

  OGNL表達式語言的特點如下:  

    •  支持對象方法的調用;
    • 支持靜態方法的調用;
    • 支持變量的賦值;
    • 可以操作集合數據 。

  OGNL上下文作用於Struts2中的ActionContext對象,ActionContext對象是Struts2框架中的一個核心對象,結構包括值棧(根)、application、session、request、parameters、attr。其中,值棧中的對象可以直接進行獲取,取值方式為: ${user.name}

;application中的對象獲取方式為: #application.name#application.[‘name‘] ;request中的對象獲取方式: #request.name#request.[‘name‘] ,這就相當於調用了 request.getAttribute("name") 方法;session中對象獲取方式與上述類似;而attr不指定範圍來獲取屬性值,搜索範圍按page、request、session、application的次序進行搜索,對象獲取方式與上類似。

  註意:使用Struts2標簽需要引入Struts2標簽庫,在JSP頁面頭部通過 <%@ taglib prefix="s" uri="/struts-tags"%> 進行引入。

二、ognlContext補充說明  

  1. ognlContext(ognl上下文對象),是一個map類型的對象。存在唯一的叫做根的對象(root),可以通過程序設定上下文當中的哪個對象作為根對象。

  2. 在OGNL中,如果表達式沒有使用“#”號,那麽OGNL會從根對象中尋找該屬性對應的get方法,如果尋找的不是根對象中的屬性,則以#作為開頭,告訴OGNL,去尋找你所指定的屬性。

   例如:

    1.    建立兩個Bean對象,定義name屬性,設置get或set方法;
    2.    在ognlTest中, OgnlContext context = new OgnlContext() ;
    3.    context.put("person",person) ; context.put("dog",dog) ;
    4.    將Person設置為root根對象, context.setRoot(person) ;
    5.   
      Object object = Ognl.parseExpression("name"); // 對name屬性進行解析,此處應該對應person,即根對象的name值
      Object object1 = Ognl.parseExpression(#dog.name);  // 對dog的name屬性進行解析,獲取dog的name值

      6. Object object2 = Ognl.getValue(object1,context,context.getRoot());

  3. 當使用OGNL調用靜態方法的時候,需要按照如下語法編寫表達式:  

   @[email protected](parameter) 即: @[email protected](10) ; 對於OGNL來說,java.lang.Math是其的默認格式,如果調用java.lang.Math的靜態方法時,無需指定類的名字,比如: @@min(4,10);

  4. 過濾(filltering)方法:   

    對一個集合進行過濾,返回一個子集合。 Collection.{?expression} 表示對Collection集合進行過濾,條件為expression。 Ognl.getValue("#persons.{?#this.name.length() > 4 }.size()", context, context.getRoot()) ,OGNL針對集合提供了一些偽屬性(如size,isEmpty......),讓我們可以通過屬性的方式來調用方法。

名稱 說明
獲取滿足指定條件的所有元素 Collection.{?expression}
^ 獲取滿足指定條件的所有元素中的第一個元素Collection.{^expression}
$

獲取滿足指定條件的所有元素中的最後一個元素Collection.{$expression}

    

  

  5. 投影(projection)方法:Collection.{expression}

  註意:過濾與投影之間的差別,類比於數據庫中的表,過濾是取行的操作,而投影是取列的操作。

三、總結

  關於Struts2標簽庫屬性值的%與#的關系:

  • 如果標簽的屬性值是OGNL表達式,那麽無需加上%{} 。
  • 如果標簽的屬性值是字符串類型,那麽在字符串當中凡是出現的%{}都會被解構成OGNL表達式,解析完畢後再與其他的字符串進行拼接組成最後的字符串值。
  • 我們可以在所有的屬性值上加%{},這樣如果該屬性是OGNL表達式,那麽標簽處理類就會將%{}忽略。    

Struts2高級開發之OGNL