1. 程式人生 > >Ognl和值棧

Ognl和值棧

Ognl
OGNL是Xwork框架提供的功能,Xwork是struts2基礎架構,Xwork是一個ioc容器。
OGNL是Object Graphic Navigation Language(物件圖導航語言)的縮寫,它是一個開源專案,struts2使用ognl,作為表示式語言。

使用OGNL可以方便向物件中設定屬性值,從物件中獲取屬性值。
ognl包括三個元件:
1、ognl的上下文
ognl的上下文底層就是map,就是ognl資料環境,表示在哪些操作物件,在上下文中操作物件
2、ognl的上下文中根物件
在上下文預設操作的根物件
如果操作根物件,表示式中不用加#號,如果要操作非根物件,表示式前加#號,表示式包括非根物件對應的key
3、表示式
通過ognl的表示式向物件中賦值,從物件取值
表示式理解為:“屬性.屬性.屬性…”
比如:"#queryVo.User.uname"從非根物件queryVo中取出User屬性物件中uname 屬性值
比如:User.uname 從根物件中取出Userr屬性物件中uname 屬性值
在這裡插入圖片描述


值棧
字面上,ValueStack是Struts的一個介面,字面意義為值棧,OgnlValueStack是ValueStack的實現類。

OnglValueStack包括兩部分:root、context。

在這裡插入圖片描述
在這裡插入圖片描述
context:OgnlContext,ognl上下文
root:OgnlContext的根物件
root:struts2定義compoundRoot作為根物件,compoundRoot底層是ArryList,實現棧結構(先進後出)。
非根物件:
在struts2中向ognl上下文中存了非根物件,request、session、application、parameters
總結:
struts2中值棧就是struts2資料中心!!!

值棧的存取流程

  1. 1、使用者請求struts2前端控制器
  2. 2、建立action例項和OgnlValueStack例項
  3. 3、將action例項壓到OgnlValueStack例項中context中Root中。
    此時Action例項在compoundRoot的棧頂
  4. 4、struts2使用ognl表示式向compoundRoot的棧頂元素即action例項設定值
  5. 5、如果在action方法中直接向屬性設定值,相當於向棧頂元素設定了屬性值
  6. 6、在頁面中通過struts2標籤或el獲取值棧中屬性值

在這裡插入圖片描述

action例項在棧頂

賦值:
1、請求引數,通過屬性驅動(通過ognl表示式)將屬性值設定到action的例項中
2、如果在action方法中修改屬性值,相當 於修改值棧中棧頂元素(action例項)的屬性值

取值:
頁面上使用struts2的標籤和el都可以取,從值棧中取資料。

action例項不在棧頂

將一個新物件壓入棧頂,action例項不在棧頂。

頁面上查詢值棧資料:
從棧頂元素開始找對應的屬性,如果有屬性,則取出屬性的值,後邊的元素不再找了。

//從值棧中查詢物件,從棧頂順序查詢物件的屬性,如果找到屬性則取值,不再向下找
		valueStack.findValue();

		//將物件壓入棧頂
		valueStack.push();

非根物件

在OnglContext中,除了root以外,struts將reuqest、session、application物件儲存到ognl的上下文。

	parameters: 該 Map 中包含當前請求的請求引數
	request: 該 Map 中包含當前 request 物件中的所有屬性
	session: 該 Map 中包含當前 session 物件中的所有屬性
	application:該 Map 中包含當前 application  物件中的所有屬性
	attr: 該 Map 按如下順序來檢索某個屬性: request, session, application

注意:request,先從request域中取,如果取不到再從值棧取。