day61_struts2_03.1:【值栈valueStack的理解】-超容易忘!-就这样记住

来源:互联网 发布:中国房地产 知乎。 编辑:程序博客网 时间:2024/06/16 04:34
public class ActionDemo4 extends ActionSupport{@Overridepublic 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类 这是源码过程。





原创粉丝点击