作为MVC框架,一个最主要的功能就是对请求中的数据进行存储和显示,Struts2将数据存储在值栈中。
ValueStack说明:
1.ValueStack是一个接口,在Struts2中使用OGNL表达式,实际上是使用实现了ValueStack接口的类OgnlValueStack。
2.ValueStack贯穿整个Action的生命周期。每个Action都拥有一个ValueStack对象。
3.Struts2把ValueStack对象保存在名为struts.valueStack的request域中。
获取值栈的三种方法:
<span style="white-space:pre"> </span>ValueStack valueStack = ActionContext.getContext().getValueStack();
ValueStack valueStack1 = ServletActionContext.getContext().getValueStack();
ValueStack valueStack2 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
值栈的内存图:
可以看出ValueStack包含两部分:context和root,root为对象栈,context为map栈。
root内存图:
context内存图:
其中context中的_root和root的内容是一样的。
下面让我们来看一下root中到底放了什么:
可以看出root是类CompoundRoot实现的,查看CompoundRoot的源码可知,root其实是一个ArrayList,而中图中也可以看出,其内存放了ValueStackAction和DefaultTextProvider,分别是当前Action和国际化支持的类。
而context中信息主要放在_values的table,里面一map形式存放了request、session和application等信息。
到此我们可以总结出值栈的完整结构:
值栈作为Struts2存储和显示数据的核心,熟悉其数据结构,才能掌握请求中数据的传输。