Struts2筆記——ONGL表達式語言


OGNL是ObjectGraphic Navigation Language(對象圖導航語言)的縮寫,它是一個開源項目。 Struts 2框架使用OGNL作為默認的表達式語言。

-------------------------------------
相對EL表達式,它提供了平時我們需要的一些功能,如:
    * 支持對象方法調用,如xxx.sayHello();
    * 支持類靜態方法調用和值訪問,表達式的格式為@[類全名(包括包路徑)]@[方法名 |  值名],例如:
        @java.lang.String@format('foo%s', 'bar')或@cn.itcast.Constant@APP_NAME;
    * 操作集合對象。
    * Ognl 有一個上下文(Context)概念,說白了上下文就是一個MAP結構,它實現了java.utils.Map接口,在Struts2中上下文(Context)的實現為ActionContext,下面是上下文(Context)的結構示意圖

圖片

當Struts2接受一個請求時,會迅速創建ActionContext,ValueStack,action 。然后把action存放進ValueStack,所以action的實例變量可以被OGNL訪問。 

-------------------------------------

訪問上下文(Context)中的對象需要使用#符號標注命名空間,如#application、#session

 


另外OGNL會設定一個根對象(root對象),在Struts2中根對象就是ValueStack(值棧) 。如果要訪問根對象(即ValueStack)中對象的屬性,則可以省略#命名空間,直接訪問該對象的屬性即可。

 


在struts2中,根對象ValueStack的實現類為OgnlValueStack,該對象不是我們想像的只存放單個值,而是存放一組對象。

在OgnlValueStack類里有一個List類型的root變量,就是使用他存放一組對象

圖片

 

在root變量中處於第一位的對象叫棧頂對象。通常我們在OGNL表達式里直接寫上屬性的名稱即可訪問root變量里對象的屬性,搜索順序是從棧頂對象開始尋找,如果棧頂對象不存在該屬性,就會從第二個對象尋找,如果沒有找到就從第三個對象尋找,依次往下訪問,直到找到為止。
 

注意: Struts2中,OGNL表達式需要配合Struts標簽才可以使用。如:<s:property value="name"/>

 
-------------------------------------
由於ValueStack(值棧)是Struts2中OGNL的根對象,如果用戶需要訪問值棧中的對象,在JSP頁面可以直接通過下面的EL表達式訪問ValueStack(值棧)中對象的屬性:

${foo} //獲得值棧中某個對象的foo屬性
 

 

如果訪問其他Context中的對象,由於他們不是根對象,所以在訪問時,需要添加#前綴。
*    application對象:用於訪問ServletContext,例如#application.userName或者#application['userName'],相當於調用ServletContext的getAttribute("username")。 

 

*    session對象:用來訪問HttpSession,例如#session.userName或者#session['userName'],相當於調用session.getAttribute("userName")。

 

*    request對象:用來訪問HttpServletRequest屬性(attribute)的Map,例如#request.userName或者#request['userName'],相當於調用request.getAttribute("userName")。

 

*    parameters對象:用於訪問HTTP的請求參數,例如#parameters.userName或者#parameters['userName'],相當於調用request.getParameter("username")。

 

*    attr對象:用於按page->request->session->application順序訪問其屬性。


===============================

為何使用EL表達式能夠訪問valueStack中對象的屬性 

原因是Struts2對HttpServletRequest作了進一步的封裝。簡略代碼如下:  

圖片


===============================

采用OGNL表達式創建List/Map集合對象 

如果需要一個集合元素的時候(例如List對象或者Map對象),可以使用OGNL中同集合相關的表達式。

使用如下代碼直接生成一個List對象:  
圖片

Set標簽用於將某個值放入指定范圍。

scope:指定變量被放置的范圍,該屬性可以接受application、session、request、page或action。如果沒有設置該屬性,則默認放置在OGNL Context中。

value:賦給變量的值.如果沒有設置該屬性,則將ValueStack棧頂的值賦給變量。 

 ===============================

采用OGNL表達式判斷對象是否存在於集合中

對於集合類型,OGNL表達式可以使用in和notin兩個元素符號。其中,in表達式用來判斷某個元素是否在指定的集合對象中;not in判斷某個元素是否不在指定的集合對象中,如下所示。  

圖片

===============================

OGNL表達式的投影功能

除了in和notin之外,OGNL還允許使用某個規則獲得集合對象的子集,常用的有以下3個相關操作符。

?:獲得所有符合邏輯的元素。

^:獲得符合邏輯的第一個元素。

$:獲得符合邏輯的最后一個元素。
 

例如代碼:  
  圖片

在上面代碼中,直接在集合后緊跟.{}運算符表明用於取出該集合的子集,{}內的表達式用於獲取符合條件的元素,this指的是為了從大集合books篩選數據到小集合,需要對大集合books進行迭代,this代表當前迭代的元素。本例的表達式用於獲取集合中價格大於35的書集合。  

圖片

 


 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM