什么是ValueStack
它是一个接口com.opensymphony.xwork2.util.ValueStack。我们使用它是将其做为一个容器,用于携带action数据到页面。在页面上通过ognl表达式获取数据。
valueStack主要是将action数据携带到页面上,通过ognl获取数据
1.ValueStack有一个实现类叫OgnlValueStack.
2.每一个action都有一个ValueStack.(一个请求,一个request,一个action,一个valueStack) valueStack生命周期就是request生命周期。
3.valueStack中存储了当前action对象以及其它常用web对象(request,session,application.parameters)
4.struts2框架将valueStack以“struts.valueStack”为名存储到request域中。
valueStack结构
ValueStack中 存在root属性 (CompoundRoot) 、 context 属性 (OgnlContext )!并且context中含有root
* CompoundRoot 就是ArrayList
* OgnlContext 就是 Map
list集合中存储的是action相关信息
map集合中存储的是相关映射信息,包含 paramters,request,session,application attr等。
我们想要从list中获取数据,可以不使用#号.(它就是ognl的root)
如果从map中获取数据,需要使用#. (其实在struts2中的map–context其实就是ognlContext)
结论:
ValueStack它有两部分 List Map
在struts2中List就是root Map就是ognlContext.
默认情况下,在struts2中从valueStack获取数据从root中获取。
值栈对象的创建 ,ValueStack 和 ActionContext 是什么关系 ?
valueStack是每一次请求时,都会创建.
ActionContext ctx = ActionContext.getContext();
if (ctx != null) { stack = ctx.getValueStack(); }
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
如何获得值栈对象?
对于valueStack获取有两种方式:
1.通过 request获取
ValueStack vs=(ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
2.通过ActionContext获取.
ValueStack vs=ActionContext.getContext().getValueStack();
向值栈保存数据 (主要针对 root)
主要有两个方法
push(Object obj)——->底层就是 root.add(0,obj) 将数据存储到栈顶。
set(String name,Object obj);—–>底层是将数据封装到HashMap中,在将这个HashMap通过push存储。
在jsp中 通过 <s:debug />
查看值栈的内容
在JSP中获取值栈的数据
root中数据不需要#,而context中数据需要#
1.如果栈顶是一个Map集合,获取时,可以直接通过Map集合的key来获取value.
<s:property value="username"/>
2.如果栈顶数据不是一个Map,没有key值,可以使用序号来获取。
<s:property value="[0]"> 从0的位置向下查找所有。<s:property value="[0].top"> 只查找0位置上数据。
如何获取OgnlContext中数据:
request: <s:property value="#request.username"/>
session: <s:property value="#session.username"/>
application:<s:property value="#application.username"/>
attr: <s:property value="#attr.username"/>
parameters:<s:property value="#parameters.cid[0]"/>