【java】Struts2中值栈的理解

来源:互联网 发布:seo工作难点跟重点 编辑:程序博客网 时间:2024/05/22 02:30

一、前言

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

二、值栈是什么?

这里写图片描述

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

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

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

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

      对象栈:

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

      map栈:

  1. 可以存储request、session、Application
  2. 可以存储对象
  3. ognl表达式访问,如果一个对象放到request中,#request.对象的key值.属性。如果对象直接放到map中,#对象的key值.属性
  4. 把一个对象放到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请求过程源码分析

0 0