原文地址:http://blog.csdn.net/wyply115/article/details/8257140 ,有兴趣的朋友可以去他博客学习学习.
一、ValueStack
1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用 3.struts2把ValueStack对象保存在名为:struts.valueStack的request域中.即ValueStack作用域为request.当action创建的时候,ValueStack就创建了,action被销毁的时候,ValueStack就销毁了
(3)ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
6.ValueStack内存结构图
7.常用的存储数据的方法
(1)向map栈中存数据,即ValueStack中的context(OgnlContext)
* 通过request,session等向map中存储数据
ServletActionContext.getRequest().setAttribute("username","joey");
ServletActionContext.getSession().put("pwd","123");
* 直接向map栈中放数据
ActionContext.getContext().put("msg","how you doing");
(2)向对象栈中存数据,即ValueStack中的root(CompoundRoot)对象
* 先得到root,再把数据压入到root中,这中方式是放入到栈底.
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.getRoot().add(new Person());
* 先得到root,利用add(index,Object)把一个对象压入到root中指定位置.
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.getRoot().add(0,new Person());//这里0,表示压入栈顶.
* 存放一个map到对象栈中
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.set("msg","dude"); //先封装成Map,在把Map放入到对象栈中,且放入栈顶.
* 利用valueStack的push方法把一个对象直接压入栈顶
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.push(new Person());
8.利用OGNL表达式取ValueStack中的数据
(1)<s:property />:取栈顶的元素.
(2)<s:iterator />:取栈顶的元素.
注意:此标签的value属性值无论来自对象栈还是Map栈,都可以不加#前缀(<s:select/>标签也适用).
因为此标签在迭代的时候,总是把当前正在迭代的元素放入到栈顶.
二、ognl
1.ognl是struts2中使用的一种表达式语言,可用于jsp的标签库中,以方便访问各种对象的属性.
它用于把界面的参数传递到Action中(并进行类型转换),它还可以用于struts2的配置文件中.
2.Root对象
OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象.
例如: