值栈(重要)和ognl表达式 (值栈其实是一个接口 它的实现类是OgnlValueStack)
1、 只要是一个mvc框架,必须解决数据的存和取的问题
2、 Struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构
3、 把数据存在值栈中,在页面上利用ognl表达式显示出来
值栈的内存结构
获取值栈的路径
//获取值栈的三种方法 ValueStack v1 = ActionContext.getContext().getValueStack(); ValueStack v2 = ServletActionContext.getValueStack(ServletActionContext.getRequest()); ValueStack v3 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
三种方式获取的值栈都是同一个对象
说明:
1、 因为有一种是从request域中获取的,所以生命周期就是一次request请求
内存结构:
值栈有两个内存结构:
一个是Map(map栈 在这里存放了request,response,session,application等servlet容器的内容)
一个是ArrayList结构(root 对象栈)
1、 大致图:
说明:
从上图中可以看出valueStack总共分为两个部分:
对象栈:root (arraylist结构)
Map栈:_values 在这里存放了request,response,session,application等servlet容器的内容
对象栈( root arrylist结构)的存储操作
public class ValueStackAction extends ActionSupport { public String testGetValueStake(){ //说明值栈是从request中获取到的 所以 值栈的生命周期就是一次 request请求 ValueStack v1 = ActionContext.getContext().getValueStack(); Person p = new Person(); p.setName("hello"); //方式1 //push可以直接放入到栈顶! v1.push(p);//将对象放入栈顶 //获取对象的值栈 Object peek = v1.peek(); System.out.println(peek.toString()); //Person{name='hello'} //方式2 //add就必须先getRoot() v1.getRoot().add(p); Object o = v1.getRoot().get(0); System.out.println(o.toString()); //Person{name='hello'} //删除值栈对象 v1.getRoot().remove(0); //方式1 v1.pop(); //方式2 return null; } }
Map栈( _Values map结构)的存储操作
_values 在这里存放了request,response,session,application等servlet容器的内容 取和删除都和request等一致