public class ActionDemo4 extends ActionSupport
{
@Override
public String execute() throws Exception {
//===【对值栈的理解】
ValueStack vs = ActionContext.getContext().getValueStack();//①==######=【拿到的是Root区(list)】---set(k,v)操作的也就是Toot(list)区。
Map<String, Object> map = vs.getContext();//②==######=【拿到的是Context区(map)】;
//###【Map区有一个List区的引用(可以看作map区包含了list区)】。
//######===狭义的值栈:List区。===广义的值栈:List区+Map区。
vs.set("key1", "aaa");
vs.set("key2", "bbb");
/*// 底层创建一个map集合, 将set的key和value给map集合, map集合放在root的底层list中(Root区)。
// 页面:
<s:debug />
<!-- 获取值栈中(root区)的数据 -->
<s:property value="key1"/>-------><s:property value="key2"/>
===页面取值成功。查看debug 值栈信息,可见root区,栈顶多了一个map对象。 ===map
====<s:property value="key1"/>标签 底层就是:
通过表达式的key,传给valueStack.findValue("key"),找到value显示。
API:vs.findValue(expr)
*/
return SUCCESS;
}
}
①===结构-存储内容 理解:
###### 值栈 就是一个 存储数据的对象:一个大Map 。总体是个Map(常说的Context区(map)),Context区里又包含 Root区(List对象)的引用。
------只不过 通常会把 List区拿出来,单独说明。因为它的特殊之处:访问后创建的action对象 放在Root区(源码就是这样的)。
------每个区存的什么数据:牢记(源码就是这样的)。
######【Root区(list)存的是: action对象;Context区(map)存的是: request、attr等域对象(引用)、List区(引用)】
②====对比(作用)理解:
值栈valuestack 和 Ognl表达式的关系是?
就像 request等域对象 和 EL表达式 的关系。===都是 页面表达式 访问 存储数据的对象 ,在页面显示。
==================================
拓展:
获取valueStack方式二:request:核心filter-->ExecuteOperation类-->Dispatcher类-->servletActionContext类 这是源码过程。