1.valueStack简介
我们使用valueStack的主要目的是为我将我们action中产生的数据携带到页面上,也就是说valueStack它就是一个容器。
在Struts2框架中将valueStack设计成一个接口。
com.opensymphony.xwork2.util.ValueStack
我们主要使用的是它的实现类
com.opensymphony.xwork2.ognl.OgnlValueStack。
当客户端向我们发送一个请求,服务器就会创建一个Action来处理请求,struts2中的action是一个多例,每一次请求都会有一个新的action对应。所以它不存在线程安全问题。
一个valueStack对应一个action,valueStack贯穿整个action的生命周期。
request-------Action------ValueStack
struts2框架将valueStack保存在request中。
valueStack主要有两部分组成:
CompoundRoot:它就是一个ArrayList
它主要存储的是action的相关数据
Map<String,Object> context:就是一个Map
Context中主要存储了一些引用,这个引用主要是关于web开发中相关信息
pameters :请求参数
request:请求对象中所有属性
session:会话对象中所有属性
application:application对象中的所有发展
以上都是Map
在struts2框架中我们通过ognl表达式来获取valueStack中数据,没有使用#就会从CompoundRoot中获取数据,
如果使用#来获取,这时就会从context中来获取.
2.如何获取valueStack
第一种方式:可以直接通过request对象来获取.
ServletActionContext
第二种方式:使用ActionContext来获取
ActionContext(简单推荐)
3.什么是ActionContext
ActionContext它是action上下文,strtus2框架它使用actionContext来保存Action在执行过程中所需要的一些对象,例如 session, application…
ActionContext的获取 是通过它的静态方法getContext()得到。
Struts2会根据每一次的http请求来创建对应的ActionContext,它是与当前线程绑定的。
每一次请求,就是一个线程,对应着一个request,每一次请求,会创建一个Action,每一个action对应一个ActionContext.每一次请求也对应着一个valueStack.
request---ActionContext----Action-----ValueStack它们都对应着一次请求(一个线程).
valueStack与ActionContext本质上是可以获取
4.valueStack的作用
主要用来存储数据,见到那介绍一下存储数据的两种方式
1.手动存储
(1)push方法:valueStack.push("jack");存储在root中
(2)set方法:valueStack.set("username","jack");存储为一个map,也是存在root中
如何在页面上获取
我们在struts2框架中可以使用ognl+valueStack达到在页面(jsp)上来获取相关的数据。
要想在jsp页面上使用ognl表达式,就需要结合struts2框架的标签,导入标签后如下
<s:property value="[0].top"/>
<s:property value="username"/>
2.自动存储
每次请求,访问action,这个对象会存储到valueStack中。
实现modelDrivern接口后可以封装为指定对象