--------------------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)查看源码后发现:
1)OgnlValueStack 类实现了 ValueStack 接口
2)CompoundRoot 类继承了 CopyOnWriteArrayList 类,
而 CopyOnWriteArrayList 类又实现了 List 接口
3)OgnlContext 类实现了 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】