struts2为何使用值栈,如何获取值栈对象

一、什么是值栈

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.属性名 进行调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清如许.

整理不易,点滴助力就是不竭动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值