0
点赞
收藏
分享

微信扫一扫

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


一、什么是值栈

1、之前在web阶段,在servlet里面操作,把数据放到作用域对象里,在页面中使用el表达式获取到对应的值,域对象在一定的范围内存值和取值。

2、在struts2里面提供本身的一种存储机制,类似于域对象,是值栈,可以存值和取值

在action里面把数据存放到值栈里面,在页面中获取到值栈数据

3、servlet和action的区别

前面讲action生命周期时已经提到:

servlet:默认在第一次访问时创建,只创建一次,单实例对象,服务器关闭时销毁,

action:每次访问时都创建,每次访问action都会创建action对象,多次创建,多实例对象

4,值栈的存储位置

每次访问action的时候,都对创建action对象

在每个action里头都会有一个值栈对象

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

二、获取值栈对象

先进后出(或后进先出),类似于一个带底的容器,先放进去的最后才能拿出来。

最上面元素叫栈顶元素

存元素叫做压栈

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

获取值栈:

ActionContext context = ActionContext.getContext();

ValutStack vs = context.getValueStack();//值栈对象

值栈的生命周期:一次请求

证明值栈对象的生命周期是跟请求相关的。

在action类获取值栈对象,打印出hashcode,然后在jsp中再拿到值栈对象进行打印。如果是转发过去的,两个的hashcode应该是一样的。如果是重定向过去的就不一样。

值栈的内存结构:

如图所示:

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

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



举报

相关推荐

0 条评论