【java】Struts2中值栈的理解

xiaoxiao2021-02-28  66

一、前言

      小编最近又继续学习了java的经典框架S2SH,在struts2中很激动人心的特性就是引入了值栈,统一管理数据,这样一来,数据统一管理,大大方便了程序的编写。那值栈到底是什么呢?小编慢慢道来。

二、值栈是什么?

值栈:是一个可以线程安全的为每个请求提供公共存储数据服务。

      当请求到达的时候,struts2会为每个请求安排不同的值栈,一个值栈对应一个请求。值栈封装了一次请求所需要的所有的数据。当请求结束的时候,值栈也就是自动清理。这个就是值栈的生命周期。

      另外值栈分为了两个类型:对象栈和map栈。这里我们需要重点了解一下,如何向这两种类型的值栈中存储和读取数据。

对象栈和map栈有什么区别?

      对象栈:

处于对象栈中的对象中的属性可以直接访问如果在对象栈中有一样的名称属性,从栈顶开始查找,直到找到为止回显的数据,应放到对象栈中,效率高。用ognl表达式访问对象栈,直接属性名称就可以了,不加#

      map栈:

可以存储request、session、Application可以存储对象ognl表达式访问,如果一个对象放到request中,#request.对象的key值.属性。如果对象直接放到map中,#对象的key值.属性把一个对象放到map中,不能直接访问对象的属性,得使用#

三、值栈的存储和读取

3.1 把对象存储到对象栈中

      存储到对象栈中,要使用“ActionContext.getContext().getValueStack()”+…,

//把Departmentlist放到对象栈的栈顶 ActionContext.getContext().getValueStack().push(DepartmentList); //把Departmentlist放到对象栈的栈顶 ActionContext.getContext().getValueStack().getRoot().add(0,DepartmentList); //放到栈顶 //把Departmentlist放到对象栈的栈顶 ActionContext.getContext().getValueStack().getRoot().add(DepartmentList); //放到栈底 //获取对象栈顶的元素 ActionContext.getContext().getValueStack().peek(); ActionContext.getContext().getValueStack().getRoot().get(0); //移除对象栈顶的元素 ActionContext.getContext().getValueStack().pop(); ActionContext.getContext().getValueStack().getRoot().remove(0); //把一个map放入到对象栈的栈顶 //ActionContext .getContext().getValueStack().set(Key, 0);

3.2 把对象栈中的数据取出

      在开始遍历的时候不需要指明,直接调用其中的属性就可以了。

<s:iterator > <tr class="TableDetail1 template"> <td><s:property value="dname"/></td> <td><s:property value="description"/></td> <td> <!-- 在struts2的标签中只能用ognl表达式,不能用el表达式 在html标签中,只能使用el,不嫩使用ognl表达式 --> <s:a action="departmentAction_deleteDepartment?did=%{did}">删除</s:a> <a href="saveUI.html">修改</a> </td> </tr> </s:iterator>

3.3 把对象存储到Map栈中

      对于map就要有不同的分析了,对象是直接存储在map中的,还是存储在request中,然后在存储在map中。

//把一个对象存放到map栈中 ActionContext.getContext().put("departmentList", DepartmentList); //#request.departmentList //ServletActionContext.getRequest().setAttribute("departmentList", DepartmentList);

3.4 从Map栈中取数据

      在开始遍历的时候,需要指明value,。

<s:iterator value="#DepartmentList"> <tr class="TableDetail1 template"> <td><s:property value="dname"/></td> <td><s:property value="description"/></td> <td> <!-- 在struts2的标签中只能用ognl表达式,不能用el表达式 在html标签中,只能使用el,不嫩使用ognl表达式 --> <s:a action="departmentAction_deleteDepartment?did=%{did}">删除</s:a> <a href="saveUI.html">修改</a> </td> </tr> </s:iterator>

四、进阶

      在开发的时候我们经常遇到以下这些情况:

list中含有list

list中含有map

map中含有list

4.1 list中含有list

<!-- list中含有list --> <s:iterator> <s:iterator> <s:property value="dname"/> </s:iterator> </s:iterator>

4.2 list中含有map

<!-- list中含有map--> <s:iterator value="#list"> <s:iterator value="top"> <s:property value="key"/> <s:property value="value.dname"/> </s:iterator> </s:iterator>

4.3 map中含有list

<!-- map中含有list--> <s:iterator value="#maps"> <s:property value="key"/> <!-- 该迭代就是一个list--> <s:iterator value="value"> <s:property value="dname"/> </s:iterator> </s:iterator>

五、小结

      搞清楚map是用#,对象栈直接读取。

      综上,重点就是对map栈和对象栈中的数据进行读取,没毛病!多多总结方法,以后总会用到的。还有就是iterator的遍历,这个操作也是值得研究的!加油!

借鉴博客:

Struts2流程机制

Struts2完成一次请求的过程

struts2请求过程源码分析

转载请注明原文地址: https://www.6miu.com/read-58660.html

最新回复(0)