什么是值栈?
值栈:ValueStack.其贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个 ValueStack 对象). 相当于一个数据的中转站. 在其中保存当前s.
* 创建一个Action的实例,创建一个ValueStack.
Struts 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性中,request中.
* 将值栈保存在request域中一份. request.setAttribute(“struts.valueStack”,valueStack);
值栈的内部结构?
值栈的内部结构有两个逻辑单元:
* 一个对象栈 :root CompoundRoot就是一个ArrayList.
* 一个ContextMap :context OgnlContext就是一个Map.
值栈ValueStack 和 ActionContext关系? --- 值栈的创建
查看源码;
* 在创建ActionContext时候,创建了ValueStack对象,同时将ValueStack存入到ActionContext中.
* 可以通过ActionContext对象获得到值栈对象
1
2
3
4
5
6
|
public
class
A{
private
B b;
}
public
class
B{
private
A a;
}
|
如何获得值栈对象?
1.通过ActionContext对象获得值栈.
// 1.获得值栈方式一:
1
|
ValueStack stack1 = ActionContext.getContext().getValueStack();
|
2.通过request域获得值栈对象.
// 2.获得值栈方式二:
1
|
ValueStack stack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
|
向值栈保存数据?
一般情况下说操作值栈:指的是操作值栈的root部分.
* push :将对象压入到栈顶.
* set :将对象压入到栈顶.
如果没有手动调用push或者set的时候:Action对象默认是在栈顶的.
* Action中的属性是否在栈中?一定在.
如果Action实现ModelDriven接口了:
* ModelDriven对象就会在栈顶.
在页面通过struts2标签 获取值栈内容?
获得root数据:
1
2
3
4
5
6
7
8
|
<s:property value=
"[1].top"
/>
<s:property value=
"name"
/>
<s:property value=
"user.username"
/>
<s:property value=
"user.password"
/>
<s:property value=
"username"
/>
<s:property value=
"password"
/>
<s:property value=
"list[0].username"
/>
<s:property value=
"list[0].password"
/>
|
获得context的数据:
1
2
3
4
5
|
获得request中的数据:<
s:property
value
=
"#request.name"
/><
br
/>
获得session中的数据:<
s:property
value
=
"#session.name"
/><
br
/>
获得application中的数据:<
s:property
value
=
"#application.name"
/><
br
/>
<
s:property
value
=
"#attr.name"
/>
<
s:property
value
=
"#parameters.username"
/>
|