14.(1)Struts2_值栈

来源:互联网 发布:文字转音频软件 编辑:程序博客网 时间:2024/05/17 18:23

Struts2_值栈(1)(2)(3)转载于三位不同的博主,帮助理解,谢谢


关于值栈:

1.struts2中利用值栈来存储数据,在struts2中,把数据存在值栈中,然后在jsp页面用ognl表达式取出。

例:helloworld时,${productName}读取productName值,实际上该属性并不在request等域对象中,而是从值栈中获取的。


2.获取方法:在struts2中的action有三种方法获取值栈

ValueStack valueStack=ActionContext.getContext().getValueStack();
ValueStack valueStack=(ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
ValueStack valueStack=ServletActionContext.getValueStack(ServletActionContext.getRequest());

可以看到我们可以利用request来获取值栈,而request的生命周期为一次请求,所以值栈的生命周期也为一次请求。


3.ValueStack 是一个接口,它的实现类是ognlvalueStack

在valueStack中有两个数据结构,一个名字为context,另一个为root。

(1)context的类型是OgnlContext,OnglContext实现了Map接口,所以context本质上是一个Map。

map栈中有一个名称为_values的对象,它是一个HashMap,在这里存放了request,response,session,application等servlet容器的内容,我们称它为map栈

(2)root类型是CompoundRoot,CompoundRoot继承了ArrayList类,所以它本质上是一个ArrayList,我们称它为对象栈


4.值栈分为两个逻辑部分:

-->Map栈实际上是OgnlContext类型,是个Map,也是对ActionContext的一个引用,里边保存着各种Map:requestMap,sessionMap,applicationMap,parametersMap,attr
-->对象栈实际上是CompoundRoot类型,是一个使用Arraylist定义的栈,里边保存各种和当前Action实例相关的对象,是一个数据结构意义的栈。


5.map栈中还有一个名称为_root的对象,它和我们上面说的valueStack中的另一个数据结构root相同,都是对象栈,为什么valueStack中会有两个对象栈呢,这是因为struts2继承了以前一些框架的内容导致的。

对象栈中保存了两个对象,一个是ValueStackAction,它代表的是当前请求的Action,另一个是DefaultTextProvider,它是用于struts2国际化的。

图解下:


所以在jsp页面中,如果要输出的内容在对象栈中,直接指定属性名字,如果在map栈中,要用#来指定

例如

String name="aaa";String Bname="bbb";ActionContext.getContext().getValueStack().push(name);  //把字符串放入对象栈中ActionContext.getContext().put("Bname", Bname);    //把字符串放入map栈中
在jsp页面中取出的对应的值:

<s:property value="name"/><s:property value="#Bname"/>


如有错误请指出

<转载于博客园博主众里寻他壹贰度>


原创粉丝点击