值栈内部结构

--------------------siwuxie095

   

   

   

   

   

   

   

值栈内部结构

   

   

1、值栈的内部结构分为两部分:

   

1)第一部分:root,它的结构是 List 集合

   

2)第二部分:context,它的结构是 Map 集合

   

   

   

   

2、具体测试

   

1)编写 Action,并下断点

   

   

   

@Override

public String execute() throws Exception {

// (1) 通过 ActionContext 类的静态方法获取 ActionContext 对象

ActionContext context=ActionContext.getContext();

// (2) 调用 ActionContext 对象的方法获取值栈对象

ValueStack stack=context.getValueStack();

// 对两行中的任意一行下断点均可

return NONE;

}

   

   

   

2)将 Tomcat 以 Debug 的方式开启,然后开始访问

   

   

   

3)单步调试(F6),观察右上角的 Variables 视图

   

   

   

显然,stack 是 OgnlValueStack 类型的

   

   

   

4)将 Variable 视图展开一览

   

   

   

不难发现:

   

1)root 是 CompoundRoot 类型的

   

2)context 是 OgnlContext 类型的

   

   

   

5)查看源码后发现:

   

1OgnlValueStack 类实现了 ValueStack 接口

   

2CompoundRoot 类继承了 CopyOnWriteArrayList 类,

CopyOnWriteArrayList 类又实现了 List 接口

   

3OgnlContext 类实现了 Map 接口

   

   

注:CompoundRoot 类在原来的版本继承的是 ArrayList 类,

ArrayList 类也实现了 List 接口(我使用的是 Struts 2.3.33

   

   

   

   

3、功能介绍

   

1)root 实现了压栈弹栈的功能,存储了 Action 引用及请求的参数等,

并且 root 是 context 的根对象

   

即 CompoundRoot 是 OgnlContext 的根对象

   

   

2)context 存储了一些对象引用,如:parameters、request、session、

application、attr 等

   

   

   

   

4一般都是操作 root 中的数据

   

   

   

   

5、使用 Struts2 的标签 s:debug 来查看值栈结构

   

「注意:s:debug 标签仅用于调试」

   

1)具体做法:访问 Action,执行 Action 中的方法,配置返回值

到 JSP 页面中,在 JSP 页面中使用 s:debug 标签

   

不能直接访问 JSP 页面,一定要通过 Action 到 JSP 页面,因为值栈

对象存储在 Action 对象中

   

   

   

2)具体实现:

   

1)编写页面

   

debug.jsp:

   

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!-- 引入 Struts2 标签库 -->

<%@ taglib uri="/struts-tags" prefix="s"%>

   

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Debug</title>

</head>

<body>

   

<!-- 使用 Struts2 的标签 s:debug 查看值栈结构 -->

<s:debug></s:debug>

</body>

</html>

   

   

2)编写 Action

   

DebugAction.java:

   

package com.siwuxie095.action;

   

import com.opensymphony.xwork2.ActionSupport;

   

public class DebugAction extends ActionSupport {

   

@Override

public String execute() throws Exception {

return SUCCESS;

}

}

   

   

   

3)配置 Action

   

struts.xml:

   

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

   

<struts>

<package name="demo" extends="struts-default" namespace="/">

<action name="debug" class="com.siwuxie095.action.DebugAction">

<result name="success">/debug.jsp</result>

</action>

</package>

   

</struts>

   

   

   

4)访问路径,出现了 Debug 超链接

   

http://localhost:8080/工程名/debug.action

   

   

   

   

   

5)点击 Debug 超链接

   

上面是 List 结构的 root,下面是 Map 结构的 context

   

   

   

   

   

6)主要操作:一般操作的都是 Value Stack Contents 中的数据,也即 root 中的数据

   

   

   

如果在 Action 中没有做任何操作,那么栈顶元素就是 Action 引用

   

   

Action 对象中有值栈对象,值栈对象中有 Action 引用

   

   

   

   

   

   

   

   

【made by siwuxie095】

原文地址:https://www.cnblogs.com/siwuxie095/p/7346603.html