OGNL運算式語言介紹;
OGNL是Object Graphic Navigation Language(對象圖導航語言)的縮寫,
它是一個開源項目。 Struts2架構使用OGNL作為預設的運算式語言。
OGNL相對其它運算式語言具有下面幾大優勢:
1、支援對象方法調用,如xxx.doSomeSpecial();
2、支援類靜態方法調用和值訪問,運算式的格式:
@[類全名(包括包路徑)]@[方法名 | 值名],例如:
@java.lang.String@format('foo %s', 'bar')
或@tutorial.MyConstant@APP_NAME;
3、支援賦值操作和運算式串聯,如price=100, discount=0.8,
calculatePrice(),這個運算式會返回80;
4、訪問OGNL上下文(OGNL context)和ActionContext;
5、操作集合對象。
Ognl 有一個上下文(Context)概念,說白了上下文就是一個MAP結構,它實現了java.utils.Map的介面.
理解Struts2中的 ValueStack:
ValueStack實際是一個介面,在Struts2中利用OGNL時,實際上使用的是實現了該介面的OgnlValueStack類,這個類是Struts2利用OGNL的基礎
ValueStack(值棧): 貫穿整個 Action 的生命週期(每個 Action 類的對象執行個體都擁有一個
ValueStack 對象). 相當於一個資料的中轉站. 在其中儲存當前
Action 對象和其他相關對象.
Struts 架構把 ValueStack 對象儲存在名為 “struts.valueStack” 的請求屬性中,request中
在 ValueStack 對象的內部有兩個邏輯部分:
ObjectStack: Struts 把動作和相關對象壓入 ObjectStack 中--List
ContextMap: Struts 把各種各樣的映射關係(一些 Map 類型的對象) 壓入 ContextMap 中
Struts 會把下面這些映射壓入 ContextMap 中
parameters: 該 Map 中包含當前請求的請求參數
request: 該 Map 中包含當前 request 對象中的所有屬性
session: 該 Map 中包含當前 session 對象中的所有屬性
application:該 Map 中包含當前 application 對象中的所有屬性
attr: 該 Map 按如下順序來檢索某個屬性: request, session, application
理解OGNL Context:
OgnlValueStack 類包含兩個重要的屬性 一個root和一個context。
* 其中root本質上是一個ArrayList.
* 而context 是一個Map(更確切的說是一個OgnlContext對象)
在這個OgnlContext對象(context)中,有一個預設的頂層對象 _root,OGNL訪問context中這個預設頂層對象中的元素時,是不需要#號的,直接通過元素的名稱來進行訪問,
而訪問其他對象時,如 request、session、attr等,則需要#號引用。
注:Struts2將OgnlValueStack的root對象賦值給了OgnlContext 中的_root對象,在OgnlValueStack的root對象中,儲存著調用Action的執行個體,因此,在頁面上通過Struts2標籤訪問Action 的屬性時,就不需要通過#號來引用
總結:ognl Context包含 ObjectStack屬性和ContextMap屬性
當Struts2接受一個請求時,會迅速建立ActionContext,ValueStack,action 。然後把action存放進ValueStack,所以action的執行個體變數可以被OGNL訪問。
注意: Struts2中,OGNL運算式需要配合Struts標籤才可以使用。如:<s:property value="name"/>