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域中取,如果取不到再从值栈取。

扫描二维码关注公众号,回复: 3632339 查看本文章

猜你喜欢

转载自blog.csdn.net/a604435713/article/details/83002911