一、前言

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

二、值栈是什么?




【java】Struts2中值栈的理解_数据


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

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

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

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

      对象栈:

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

      map栈:

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

三、值栈的存储和读取



【java】Struts2中值栈的理解_线程安全_02


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的遍历,这个操作也是值得研究的!加油!