• 值栈内部结构


    --------------------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】

  • 相关阅读:
    Title
    Title
    JS淘宝小广告
    JS淘宝浏览商品
    JS隐藏显示图片
    JS图片轮播
    C#连接数据库的方法
    让$(window).scroll()监听事件只执行一次
    axios发delete请求,后台收不到参数;
    .gitignore规则简介
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/7346603.html
Copyright © 2020-2023  润新知