1. 能够做为一个数据中转站 web
2. 用于在前台-后台之间传递数据,最典型的作法就是struts2标签也ognl表达式的结合。我用得最多的就是数据回显。 spa
在struts-default.xml文件中决定了在web容器启动时将会建立OgnlValueStackFactory对象,该对象实现了ValueStackFactory接口,负责ValueStack的建立工做。 xml
ValueStack的生命周期是随着request的建立而建立,随request的销毁而销毁。具体可见源代码: 对象
在PrepareOperations类的createActionContext中有 继承
至于清理工做,struts统一放在了PrepareOperations类的cleanupRequest方法中。 接口
主要看OgnlValueStack类,此类实现了ValueStack接口。 生命周期
在OgnlValueStack中有两个相当重要的东西, 内存
,简称“对象栈”和“Map栈”。 get
CompoundRoot继承了ArrayList类,便是一个List集合,详见源码CompoundRoot类。 源码
Context:而context其实是一个hashMap,
。
其中_values就是平时使用的map栈,而_root只是对对象栈的引用。
经常使用方法解析:
1. push方法:
,再查看root的push方法
,顿时明白什么叫将对象压入栈顶了。
2. set(String key,Object o)方法:
再看
,
也就是说第一次使用该方法时,struts会建立一个新的map。
3. pop方法:
,移除栈顶对象,查看root的pop方法
4. peek方法
获取栈顶对象,作法与pop方法相同,只不过是get数据。
因此便可总结出使用方法:
1. 将数据放入值栈
将对象放入栈顶:
a) ActionContext.getContext().getValueStack().push("aa);
b) ActionContext.getContext().getValueStack().getRoot().add(0,"bb");
将数据放入map栈
ActionContext.getContext().getValueStack().set(“a”,”a”);
2. 从值栈中获取数据
a) 获取栈顶数据
i. ActionContext.getContext().getValueStack().peek();
ii. ActionContext.getContext().getValueStack().getRoot().get(0);
通常状况下,将对象放入栈顶以前先移除栈顶对象,这样能够节省内存空间。
重要:
1. Interator标签当前迭代的对象在栈顶。
2. Iterator标签的value能够不写,默认是迭代栈顶元素。