1. stuts2值栈概述(掌握)
1.1. 值栈(ValueStack)是什么
值栈(ValueStack),是Struts2的数据中转站,栈中自动保存了当前Action对象和其他相关对象(包括常用的Web对象的引用,如request、session、application等),也可以手动保存自己的数据对象,同时也可以随时随地将对象从值栈取出或操作(通过OGNL表达式)
值栈(ValueStack),实际是一个接口的对象的称呼,接口是ValueStack类,实现类是OgnlValueStack类,该对象是Struts2利用OGNL的基础,或者说Struts2中Ognl使用都是基于值栈完成的。
如何理解数据中转站?
其实可以将它看成是一个容器,是一个临时的数据库,为什么是临时的呢?因为它只存在于内存中
作为一个数据库仓库,存放的是那些数据呢?
答:比如request、session、application这些对象以及这些对象中的数据,都存在于值栈中
存放的目的:取值(页面中取值)
Struts2框架将ValueStack对象保存在request域中,键为“struts.valueStack”,即值栈是request域中的一个对象,一个请求对应一个Action实例和一个值栈对象。
1.1. 值栈的数据存储结构的分析(理解)
在值栈的内部有两个逻辑部分:
l ObjectStack(对象栈):又称为root栈,保存了Action的相关对象和动作,数据存储结构是List。
l ContextMap(上下文栈):又称为map栈,保存了各种映射关系,如常用的web对象的引用,数据存储结构是Map。
【示例1】值栈的获取方式:
1) request.getAttribute(“struts.valueStack”):用的较少
2) ActionContext.getContext().getValueStack():用的非常多:底层使用的还是第一种方式获取
ActionContext(Action上下文,工具类)
【值栈小结】:
值栈包括两部分: 对象栈(root栈,CompoundRoot,继承了ArrayList集合)和OGNL上下文栈(map栈,OgnlContext,实现Map接口)
而OGNL上下文栈(map栈)内部又分为两部分:对象栈(root)的引用和一个HashMap,这个HashMap存放了常用web对象的引用和其他映射关系。
1.1. 值栈的存取小结
值栈的主要作用就是数据的保存和获取(可以在任何地方获取)。
注意要点:怎么存,就怎么取
存进root栈,就不通过#获取;
存进map栈,就通过#获取
1. 如何向值栈保存数据
1) ValueStack.push(obj) :保存数据到Root栈顶-压栈顶(对象本身)-匿名
2) ActionContext.getContext().put(key,value) :保存数据到Map栈中
3) ValueStack.set(key,value):将数据保存到Root栈顶(数据对象自动被封装为Map来保存,栈顶是个map,map里面有个属性是对象)--有名字
4) 提供Action成员变量,提供getter方法(Action就在root栈中,Action属性可以被搜索)