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、使用者請求struts2前端控制器
- 2、建立action例項和OgnlValueStack例項
- 3、將action例項壓到OgnlValueStack例項中context中Root中。
此時Action例項在compoundRoot的棧頂 - 4、struts2使用ognl表示式向compoundRoot的棧頂元素即action例項設定值
- 5、如果在action方法中直接向屬性設定值,相當於向棧頂元素設定了屬性值
- 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域中取,如果取不到再從值棧取。