网站地图    收藏    合作   
<

快捷菜单 返回顶部

通过教程《值栈是什么》的学习,读者对值栈的知识已经有了一定的了解。为了让初学者更好地理解值栈,本节将讲解值栈的内部结构。

ValueStack 对象的内部有两个逻辑部分。
了解了 ValueStack 对象的内部组成后,下面通过运行项目查看 ValueStack 中的信息。

首先,在 struts2Demo05 项目的 com.mengma.ognl 包中新创建一个名称为 ValueStackAction 的类,并在类中编写一个获取 ValueStack 对象的方法,如下所示。
package com.mengma.ognl;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class ValueStackAction extends ActionSupport {
    public String execute() throws Exception {
        // 通过ActionContext获取valueStack对象
        ValueStack valueStack = ActionContext.getContext().getValueStack();
        System.out.println(valueStack);
        return SUCCESS;
    }
}
然后,将新建的 Action 信息添加到 struts.xml 中,所添加的代码如下所示:
<action name="valueStack" class="com.mengma.ognl.ValueStackAction">
    <result name="success">index.jsp</result>
</action>
最后,在 ValueStackAction 类中的第 11 行处设置断点,以 Debug 模式启动项目。在浏览器的地址栏中输入地址 http://localhost:8080/struts2Demo05/valueStack.action后,MyEclipse 会进入 Debug 模式。从 Variables 窗口中可以看到 valueStack 的结构信息,如图 1 所示。


图 1  valueStack结构

在图 1 所示的 ValueStack 结构中,只需关注 context 对象和 root 对象。从图 1 中可以看到,context 对象的类型为 OgnlContext,root 对象的类型为 CompoundRoot。如果要查看这两个类的源码,则可以看到如下语句:

OgnlContext extends Object implements Map
CompoundRoot extends ArrayList

从上述两个类的源码中可以看出,context 对象实际上就是一个 Map,root 对象实际上就是一个 ArrayList。也就说明了 ValueStack 的两个逻辑部分 ObjectStack 对应 ArrayList(root),ContextMap 对应 Map(context)。

一般情况下,root 对象在存储 Action 的相关信息时会把相关的映射压入 ContextMap 中,这些相关的映射具体如下。

需要注意的是,在 context 对象中包含了 root 对象,从 context 对象的结构中就可以查看到相关信息,具体如图 2 所示。


图 2  context对象结构

从图 2 中可以看到 context 对象中的 root 对象,这也就证明了 context 对象中包含了 root 对象,并且该对象的类型为 CompoundRoot。

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com