Struts2--值栈内部结构详解

本文详细解析了Struts2框架中的ValueStack对象,包括其内部结构、如何获取及使用,以及它如何存储Action相关信息,如参数、request、session和application等。

ValueStack 对象的内部有两个逻辑部分。

  • ObjectStack(对象栈):是 CompoundRoot 类型,用 ArrayList 定义,Struts2 把动作和相关对象压入 ObjectStack 中。
  • ContextMap(Map 栈):是 OgnlContext 类型,是一个 Map 集合,Struts2 把各种各样的映射关系(一些 Map 类型的对象)压入 ContextMap 中。

新创建一个名称为 ValueStackAction 的类,并在类中编写一个获取 ValueStack 对象的方法,如下所示。

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="pers.zhang.action.ValueStackAction">
     <result name="success">index.jsp</result>
 </action>

最后,在 ValueStackAction 类中的第 11 行处设置断点,以 Debug 模式启动项目。通过浏览器访问,从 Variables 窗口中可以看到 valueStack 的结构信息:
在上图所示的 ValueStack 结构中,只需关注 context 对象和 root 对象。从上图中可以看到,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 中,这些相关的映射具体如下。

  • parameters:该 Map 中包含当前请求的请求参数。
  • request:该 Map 中包含当前 request 对象中的所有属性。
  • session:该 Map 中包含当前 session 对象中的所有属性。
  • application:该 Map 中包含当前 application 对象中的所有属性。
  • attr:该 Map 按如下顺序检索某个属性:request,session,application。
    需要注意的是,在 context 对象中包含了 root 对象,从 context 对象的结构中就可以查看到相关信息,具体如下图所示。

    以看到 context 对象中的 root 对象,这也就证明了 context 对象中包含了 root 对象,并且该对象的类型为 CompoundRoot。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值