一、什么是值栈
1、之前在web阶段,在servlet里面操作,把数据放到作用域对象里,在页面中使用el表达式获取到对应的值,域对象在一定的范围内存值和取值。
2、在struts2里面提供本身的一种存储机制,类似于域对象,是值栈,可以存值和取值
在action里面把数据存放到值栈里面,在页面中获取到值栈数据
3、servlet和action的区别
前面讲action生命周期时已经提到:
servlet:默认在第一次访问时创建,只创建一次,单实例对象,服务器关闭时销毁,
action:每次访问时都创建,每次访问action都会创建action对象,多次创建,多实例对象
4,值栈的存储位置
每次访问action的时候,都对创建action对象
在每个action里头都会有一个值栈对象
二、获取值栈对象
栈
先进后出(或后进先出),类似于一个带底的容器,先放进去的最后才能拿出来。
最上面元素叫栈顶元素
存元素叫做压栈
获取值栈:
ActionContext context = ActionContext.getContext();
ValutStack vs = context.getValueStack();//值栈对象
值栈的生命周期:一次请求
证明值栈对象的生命周期是跟请求相关的。
在action类获取值栈对象,打印出hashcode,然后在jsp中再拿到值栈对象进行打印。如果是转发过去的,两个的hashcode应该是一样的。如果是重定向过去的就不一样。
值栈的内存结构:
如图所示:
1.值栈有两块区域。Root和context区域。
2.Root区域里面struts框架会把action对象放入到该区域。
3.Context区域struts框架会把作用域放入该区域。
4.视图想获取数据,通过ognl表达式。
可能有人会有这么一个疑问,
值栈的生命周期比session要小,为什么可以存储session和application对象?
可以这么理解,一个action加载后就有一个值栈,
页面或者action找值的时候会先从pagecontext里面找
然后是request
然后是root
然后是map
然后是session
最后是application,
不是值栈操作session,而是contextMap 栈中 有sessionMap 该Map中包含当前session对象中的所有属性
所以可以使用 #session.属性名 进行调用