在没有struts框架的时候,我们通常在Servlet中使用域对象进行存值和取值,将其作为载体来承载页面和后台之间的数据传递。

在struts2中,我们又有了一种新的机制来进行数据的传递。

那就是struts2为我们提供的ValueStack即值栈。

在理解ValueStack之前我们先要了解一下Servlet和Action的区别:

Servlet:默认在第一次访问的时候创建对象,但是它只会创建一次对象,无论后面访问多少次这个servlet,都只有一开始创建的那一个servlet对象,因此,我们说Servlet是单对象的。

Action:也是默认第一次访问的时候创建,但是每一次访问它的时候,都会创建一个新对象,因此,我们说Action是多对象的。

那么什么是值栈呢?

官方的说法是:

ValueStack是Struts的一个接口,字面意义为值栈,OgnlValueStack是ValueStack的实现类。客户端发出一个请求,struts2框架会为我们创建一个action,同时创建一个OgnlValueStack的实例,我们可以在Action中将数据封装到OgnlValueStack中,在页面中通过Ognl表达式或者EL表达式将其取出。

通俗点的理解:

我们可以直接将其理解为一种类似于域对象的用来存值和取值、在页面和后台之间传递数据的功能。** 在action中将数据存入值栈,然后在页面中通过EL表达式或者OGNL表达式将值取出。

值栈储存的位置:

值栈和Action的关系是:值栈存在于Action对象中。 每创建一个Action对象,就会创建一个值栈对象。

需要注意的是:每个Action对象中只有一个值栈对象

ValueStack.png

在Action中获取值栈对象的方法:

获取值栈对象的方法很多,最常用的是使用ActionContext类来获取:

//1、获取ActionContext类的对象

ActionContext context = ActionContext.getContext();

//2、调用ActionContext中的方法获取值栈对象

ValueStack stack = context.getValueStack();

值栈本质上是一种栈类型的数据结构,如图所示:

Stack.png

栈中数据遵循后进先出的原则,在栈最上面的元素叫做栈顶元素,新的数据存储进来的时候会压在原有数据的上面,这个操作被称为压栈。

值栈的内部结构:

值栈分为两个部分:root和context

其中,root部分是list结构,context部分是map结构

我们存值和取值一般都是操作root部分的数据,而context部分存储的是一些对象的引用,如图:

context.png

使用struts2标签中的s:debug,使用这个标签可以查看值栈的结构和储存的值

可以看到值栈中root部分的结构如下:

Value Stack Contents.png

可以明显的看出root部分的结构是一个list集合(在下一篇文章中我们会通过在ValueStack里面存值和取值更加详细深入的理解值栈的原理)

这里需要注意的是:在action没有做任何操作的情况下,栈顶元素是 action引用

因为action对象里面有值栈对象, 值栈对象里面有action引用。这样的设计方式有利于action对象和值栈对象的互相调用。

总结:值栈就是struts2为我们提供的一套类似于域对象的用来存值和取值的机制,自此我们在struts2框架中传递数据就有了两种方式:值栈和域对象。这两种方式都能实现功能,没有孰高孰低,根据我们的业务需求灵活使用即可。

感谢您的观看:)

后一篇文章将会详细讲解如何在值栈中存值和取值,并通过存值和取值来进一步理解值栈内部的结构及其工作原理,尽情期待。

java 值栈的结构_Struts2 | 深入浅出理解struts2中的值栈相关推荐

  1. Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  2. java帧结构_Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)...

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  3. Struts2中的值栈

    一 什么是值栈 值栈: struts2中提供的一种类似于域对象的工具, 用于struts2中的存值和取值. 每次访问Action的时候, 都会创建一个action对象, 而每个action对象中都存在 ...

  4. 关于Struts2中的值栈与OGNL表达式

    1.1.1    OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL     :OGNL比EL功能强大很多倍. 它是一个开源项目. ...

  5. java 从数据库取值_JAVA操作数据库--从一张表中取值,经过判断,然后插入另一张表中。...

    JAVA操作数据库-->从一张表中取值,经过判断,然后插入另一张表中. SQL语句如下:两张表 weather 和 weather_process. id均为自动增长.Oracle中采用序列 S ...

  6. 幅度和幅值有区别吗_克拉克 (Clark) 变换中等幅值 (2/3) 和等功率 (sqrt(2/3)) 变换的公式推导...

    这里直接开门见山引入克拉克变换:克拉克和派克 (Park) 变换通常用于三相交流电机的磁场定向控制.克拉克变换将三相系统(在 abc 坐标系中)的时域分量转换为正交静止坐标系 (αβ) 中的两个分量. ...

  7. php 修改json数组的值,php – 无法通过str_replace更改JSON数组中的值

    我想更改数组中的值.这是我的起始数组: Array ( [0] => Array ( [name] => aaa ) [1] => Array ( [name] => bbb ...

  8. struts2中的值栈对象ValueStack

    ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...

  9. 如何深入理解php中的值传递和引用传递

    对于值传递和引用传递,书本上的解释比较繁琐,而php面试中总会出现,下面我会通过一个生活的例子带大家理解它们之间区别. 第一步 假设我们去酒店订房间,我们把酒店的门牌号比作变量名,我们把房间里住人数当 ...

最新文章

  1. 旷视孙剑团队提出Anchor DETR:基于Transformer的目标检测新网络
  2. 操作系统pv操作学习总结
  3. Linux C :系统调用-fork,wait,subreaper
  4. MyEclipse使用总结——MyEclipse文件查找技巧
  5. 【C/C++17】_ooci.h,_ooci.cpp,_mysql.h,_mysql.cpp,_postgresql.h,_postgresql.cpp
  6. error: uuid/uuid.h: No such file or directory
  7. 图像化转向名词解释_遥感——数字图像处理名词解释及简单整理
  8. 计算机基础知识专插本,计算机基础专插本复习资料.doc
  9. C++类构造函数初始化列表及初始化成员变量的误区
  10. 【百度地图API】情人节求爱大作战——添加标注功能
  11. 李沐老师的PyTorch 版《动手学深度学习》PDF 开源了(全中文,支持 Jupyter 运行)
  12. Linux文章大合集
  13. 【转】pom.xml详解
  14. 网页点击按钮返回顶部代码
  15. python azure-storage-blob库 使用SAS key下载blob文件实例
  16. UnityShader[3]屏幕后处理学习笔记
  17. 端午节小游戏html,零代码怎么制作一个端午节H5小游戏页面?
  18. 公司法人没社保零申报,原来可以这样?
  19. python--unicode汉字编码表实现汉字输出
  20. 精选的 Go 框架,库和软件的精选清单

热门文章

  1. phantomjs搭建输出js渲染后的html接口
  2. MySQL8.0——Resource Group(资源组)
  3. 在写代码过程中遇到的问题,以及当时的解决方法(如实记录)
  4. 轻松逃脱某防火墙对ss的探测
  5. 动态规划算法 - 钢条切割问题
  6. PHP超级全局变量总结
  7. ASP.NET 自定义控件从入门到精通3补充
  8. Android 屏幕适配攻略(三)单位dp与sp
  9. EnjoyingSoft之Mule ESB开发教程第二篇:Mule ESB基本概念
  10. jacascript 立即执行函数(IIFE)与闭包