(八)Struts2进阶之值栈详解

在Ultralytics YOLO中添加/更换模块详细指南 使用参数继承 my_module_args: &my_args [64, 3, 0.5] # 定义参数模板 backbone: - [-1, 1, MyModule, *my_args] # 引用参数。 阅读详情

1.什么是值栈

在Servlet中,我们都是把数据放在域对象中,然后在jsp页面中进行读取。那么在Struts2中,提供了另外一种存储机制,就是值栈,在action中把值放入值栈,在页面中进行读取。

2.action和servlet的区别

action:每次访问的时候都会创建一次。
servlet:默认在第一次访问的时候创建,在生命周期里只会创建一次。

我们创建一个LifeAction来看看

@SuppressWarnings("serial")
public class LifeAction extends ActionSupport {

    public LifeAction() {
        System.out.println("action创建了。。。。");
    }
    @Override
    public String execute() throws Exception {
        // 没有操作
        return NONE;
    }
}

在该类中有一个构造方法,每次创建action的时候都会打印信息。
在struts.xml中配置action

<action name="life" class="com.codeliu.action.LifeAction"></action>

访问后,每次刷新页面,都会创建一个action对象。

3.值栈的存储位置

每次创建一个action对象,都会跟随着一个值栈对象,也就是说每个action里面都有一个值栈。

4.获取值栈对象

// 获取ActionContext实例对象
ActionContext context = ActionContext.getContext();
// 获取值栈对象
ValueStack stack1 = context.getValueStack();
ValueStack stack2 = context.getValueStack();
// true 说明每个action只有一个值栈对象
System.out.println(stack1 == stack2);

上述代码通过ActionContext类获取一个ValueStack(值栈),同时说明了一个action里面只有一个值栈。

5.值栈的内部结构

值栈分为两部分。第一部分是root,第二部分是context,通过给成程序加断点,我们可以看到如下的结果
27.png
context是OgnlContext的实例对象,root是CompoundRoot的实例对象,我们看看这两个类的定义

public class CompoundRoot extends ArrayList {......}
public class OgnlContext extends Object implements Map {......}

这说明root其实本质是一个ArrayList,而context本质是一个Map。

root中一般存放数值,而context一般存放对象的引用。

下面是context的存储示意图
28.png

通过debug标签,可以查看值栈的内部结构。(要使用Struts2的标签,必须在jsp开头引入标签库)

创建一个ValueStackAction.java

@SuppressWarnings("serial")
public class ValueStackAction extends ActionSupport {
    @Override
    public String execute() throws Exception {

        return SUCCESS;
    }
}

在struts.xml中配置Action

<action name="valueStack" class="com.codeliu.action.ValueStackAction">
    <result name="success">/valueStack.jsp</result>
</action>

然后创建一个valueStack.jsp

<body>
    <!-- 通过这个标签获取值栈的信息 -->
    <s:debug></s:debug>
</body>

运行这个action之后就能看到一个链接,点进去就能看到值栈的状态
root的内部
可以看到root内部的栈顶是一个action实例。

action对象里有一个值栈对象,值栈对象里有action引用。

6.向栈中放数据

向值栈中放数据有三种方法,分别是使用set方法,push方法和使用action的变量,下面来看一下。

(1)使用set方法

public class ValueStackAction extends ActionSupport {
    @Override
    public String execute() throws Exception {
        /**
         * 往值栈中放数据的三种方法
         */
        // 第一种 使用set方法
        ActionContext context = ActionContext.getContext();
        ValueStack stack = context.getValueStack();
        stack.set("url", "www.codeliu.com");
        return SUCCESS;
    }
}

同样使用debug标签查看值栈的状态,发现栈顶元素变成了我们插入的数据Map
栈顶元素已经改变了

(2)使用push方法

@SuppressWarnings("serial")
public class ValueStackAction extends ActionSupport {
    @Override
    public String execute() throws Exception {
        /**
         * 往值栈中放数据的三种方法
         */
        ActionContext context = ActionContext.getContext();
        ValueStack stack = context.getValueStack();
        // 第二种 使用push方法
        stack.push("codeliu");
        return SUCCESS;
    }
}

再次查看,发现栈顶元素变成了一个String
栈顶元素又变了

(3)使用Action类的变量来放数据

@SuppressWarnings("serial")
public class ValueStackAction extends ActionSupport {
    // 1. 定义变量
    private String url;
    // 2. 记得要get方法
    public String getUrl() {
        return url;
    }
    @Override
    public String execute() throws Exception {
        /**
         * 往值栈中放数据的三种方法
         */
        // 3.设置值
        url = "www.codeliu.com";
        return SUCCESS;
    }
}

刷新查看值栈,结果如下
栈顶没变,但action中的元素多了
我们发现栈顶元素没有变,但action实例中多了一行。

一般我们使用第三种方法更多,因为这样更节省空间,同时使用第三种方法,记得提供get方法,不然无法插入。

7.从栈中读数据

现在我们看看使用OGNL+Struts2的标签从值栈中读取使用上面第三种方法放入的数据。
(1)读字符串的值

@SuppressWarnings("serial")
/**
 * 从值栈中获取字符串、对象和List集合
 * @author liu
 */
public class GetValueFromValueStackAction extends ActionSupport {
    private String url;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
    public GetValueFromValueStackAction() {}

    @Override
    public String execute() throws Exception {
        url = "www.codeliu.com";
        return SUCCESS;
    }
}

在struts.xml中增加一条记录

<action name="getValue" class="com.codeliu.action.GetValueFromValueStackAction">
    <result>/getvalue.jsp</result>
</action>

创建getvalue.jsp

<body>
    <!-- OGNL集合Struts2的标签获取值栈中的值 -->
    <s:property value="url"/>
</body>

启动tomcat后,进入网页就能看到输出了url的值。

(2)读对象的值
还记得我们上篇文章中有一个User类,里面有username和password属性,现在我们修改GetValueFromValueStackAction类

@SuppressWarnings("serial")
/**
 * 从值栈中获取字符串、对象和List集合
 * @author liu
 */
public class GetValueFromValueStackAction extends ActionSupport {
    private User user = new User();
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public GetValueFromValueStackAction() {}
    @Override
    public String execute() throws Exception {
        user.setUsername("CodeTiger");
        user.setPassword("123456");
        return SUCCESS;
    }
}

在getvalue.jsp中添加如下代码

<!-- 通过ognl获取user对象的值 -->
<s:property value="user.username"/>
<s:property value="user.password"/>

运行后,输出我们设置的值。

(3)读List集合的值
修改GetValueFromValueStackAction类的代码如下

@SuppressWarnings("serial")
/**
 * 从值栈中获取字符串、对象和List集合
 * @author liu
 */
public class GetValueFromValueStackAction extends ActionSupport {
    private User user = new User();
    private List<User> list = new ArrayList<User>();
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

    public List<User> getList() {
        return list;
    }

    public void setList(List<User> list) {
        this.list = list;
    }

    public GetValueFromValueStackAction() {}

    @Override
    public String execute() throws Exception {
        user.setUsername("CodeTiger");
        user.setPassword("123456");
        list.add(user);
        return SUCCESS;
    }
}

读取值栈中的List,一般有三种方法

<!-- 获取List集合中的值 -->
    <!-- 第一种方式 -->
    <s:property value="list[0].username"/>
    <s:property value="list[0].password"/><br>
    <!-- 第二种方式 -->
    <s:iterator value="list">
        <s:property value="username"/>
        <s:property value="password"/>
    </s:iterator><br>
    <!-- 第三种方式 -->
    <s:iterator value="list" var="user">
        <!-- 每次遍历出来的user对象,都会放到context中去,使用OGNL取root中的数据,
            可以不用#,但取context中的数据,则要加上# 
        -->
        <s:property value="#user.username"/>
        <s:property value="#user.password"/>
    </s:iterator>

注意第三种方式


下篇文章讲OGNL,所以讲OGNL之前得先熟悉了解一下值栈,才能更好的使用OGNL。

HyperLynx实战:手把手教你搞定DDR4信号完整性仿真(附ODT与终端电阻配置避坑) 本文详细介绍了使用HyperLynx进行DDR4信号完整性仿真的实战技巧,重点解析了ODT配置与终端电阻优化的黄金法则。通过模型准备、拓扑构建、ODT扫描等关键步骤,帮助硬件工程师规避常见设计陷阱,提升高速数字电路设计的效率与可靠性。 阅读详情

相关推荐

论文代码复现 | 无人机与卡车联合配送(Python+Gurobi)(The flying sidekick traveling salesman problem)

无人机配送-代码复现The flying sidekick traveling salesman problem-Part 1文献笔记:(无人机配送-代码复现)The flying sidekick traveling salesman problem-Part 1摘要论文主要图标摘录数值实验算例结果参考文献 文献笔记:(无人机配送-代码复现)The flying sidekick traveling salesman problem-Part 1 摘要 Once limited to the milit

HsinglukLiu的博客 3万+

struts2中的值栈的详解

简单的说:值栈是对应每一个请求对象的轻量级的内存数据的中心。在struts2中每次访问Action的时候都会创建action对象,每个action对象里面都会有一个值栈对象。在action中我们可以把数据放到值栈中,然后从页面中取值。

haha_66666的博客 2753

Wireshark时间分析实战:精准调试网络延迟与时间同步问题

本文深入探讨了Wireshark在网络延迟与时间同步问题分析中的核心应用。通过实战案例,详细讲解了如何设置时间显示格式、利用时间参考点量化关键路径延迟,以及运用时间平移功能校正错位时间轴。掌握这些时间分析技巧,能帮助网络工程师精准定位隐藏于数据包时序中的性能瓶颈与故障根源。

weixin_29290963的博客 262

Struts2值栈详解

Struts2值栈详解 基本介绍      ValueStack是Struts2的一个接口,字面意义为值栈,OgnlValueStack是 ValueStack的实现类,客 户端发起一个请求,struts2架构会创建一个action实例同时创建一个OgnlValueStack值栈实例, OgnlValueStack贯穿整个Action的生命周期,struts2中使用OGNL将请求Action的

Switch的博客 9802

【硬件开发】振铃

如果是开关管的振铃,那么桥臂的SW处产生的振铃会窜入驱动电路,造成的结果就是驱动电路和上桥臂下桥臂之间的SW节点都会有振铃现象。如果是驱动电路的振铃,那么MCU的输出引脚还是正常的PWM,但是到了MOS管两侧就变成带有振铃的PWM波形了。开关振铃产生的原因是MOS管上面的寄生电感当开关管打开时为了保持电流不变感应出的电压会对电源和地产生冲击。开关管的驱动线上的寄生电容和寄生电感导致的振铃为驱动电路振铃。开关管上的寄生电容和寄生电感导致的振铃为开关节点振铃。、电感等元件的存在,导致电路中的电压和。

weixin_62546664的博客 1827

电压电流双闭环PFC单相PWM整流

电压电流双闭环PFC单相整流。仿真及代码

xht2403267701的博客 6052

Struts2的值栈详解

ssh中页面和action之间数据存储和传递有多种方式,URL传值,模型驱动,表单传值,以及我们本文要介绍的值栈等。每种方式都有它的特点和适用范围,小编根据自身的适用经验和网 上的查询结果,对值栈的基本原理和适用方法做了一个汇总。

天道酬勤 地道酬善 人道酬诚 3892

DSSP 工具:蛋白质二级结构信息计算与批量处理教程

DSSP(Dictionary of Secondary Structure in Proteins)是一款经典的蛋白质二级结构计算工具,由荷兰癌症研究所(NKI Research)Perrakis 团队维护。它通过分析蛋白质的 PDB 结构文件,能够自动标注每个氨基酸残基的二级结构类型、相对溶剂可及性(暴露面积)等关键信息,为后续的拓扑图绘制、疏水 / 亲水表面分析、二级结构预测模型训练等提供核心数据支持。

good_rrrrr的博客 1838

Struts2的值栈(ValueStack),详解+图解

值栈的概述 1、什么是值栈 Struts2将XWork对Ognl的扩展这一套机制封装起来,这个对象叫ValueStack。 ValueStack实际上就是一个容器。 它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。 ValueStack是Struts的一一个接口,字面意义为值栈,OgnIValueStack 是ValueStack 的实现类,客 户端发起一个请求struts2 架构会创建一个action 实例

程序员猫爪 2017

基于STM32L4XX 、HAL库的STSPIN32G4三相无刷直流电机(BLDC)驱动应用C语言程序设计

/ 设置PWM模式为6步换相。│PA5-7 ├── SPI ────►│SCK/MISO│ │ 三相桥 │。– 2路电机控制高级定时器(16位,支持6路 PWM 通道)// 60度电气周期对应转速 = 60/(极对数 * 6 * 周期)// 电气角度(0-3599)

PP_Cottage的博客 147

【AlphaFold2】深入浅出,讲解Evoformer|学习笔记

本篇博客是围绕youtube德国博主Kilian Mandon()的《从头实现AlphaFold2:AlphaFold Decoded》的第五期视频讲解和note-book内容写成的笔记,加上了自己的理解和对相关概念的解释。上期我们讲解了AlphaFold2的特征提前的部分【AlphaFold2】Feature extraction:提取特征,为模型输入做准备|Datapipeline讲解。本期,我们将介绍AlphaFold2中最为庞大且最为重要的部分——Evoformer。

Yaoyao2024的博客 2014

struts2之值栈

文章目录1 值栈是什么2 值栈能干什么3 值栈有什么?3.1 狭义值栈3.2 广义值栈3.3 关于广义和狭义4 值栈的基本使用4.1 如何获取ActionContext4.2 获取过后,如何使用4.3 ValueStack的基本使用4.3.1 如何获取4.3.2 如何使用4.3.3 应用示例 1 值栈是什么 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心 Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action、Result、Interceptor等Struts2的

上善若泪 529

【图像去噪】基于梯度为0法实现图像去噪附matlab代码

近几年,徐立提出的 L0 梯度最小化模型在图像平滑领域得到了广泛的应用和发展[11]. 和以往的局部滤波模型不同的是该模型可以全局的估计图像的像素值,因此,L0 梯度最小化模型在处理图像的同时能够很好的保护图像的边缘.​。

qq_59747472的博客 184

struts2中的值栈

一看到值栈我们应该想到的关于值栈的问题 0什么是值栈,为什么使用值栈 1 .值栈的内存结构 2.值栈的生命周期 3.如何获取值栈 4.如何向值栈中存数据,取数据 5.因为数据在值栈中,如何保存数据安全性 下面我们就根据这几个问题来看看值栈: 0.什么是值栈 在servlet中,一般处理数据我们会把数据放到request域,session,application域中,通过el表达式

jys1115的专栏 1004

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Struts2笔记整理七】值栈

值栈(ValueStack) 在 Struts2 中也是非常重要的知识,它其实类似于一个数据中转站,Struts2 框架中的所有数据都保存到了 ValueStack 中。ValueStack 贯穿整个 Action 的生命周期,只要 Action 一创建,Struts2 就会创建一个 ValueStack 对象。

小异常的博客 552

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

struts2为何使用值栈,如何获取值栈对象

一、什么是值栈 1、之前在web阶段,在servlet里面操作,把数据放到作用域对象里,在页面中使用el表达式获取到对应的值,域对象在一定的范围内存值和取值。 2、在struts2里面提供本身的一种存储机制,类似于域对象,是值栈,可以存值和取值 在action里面把数据存放到值栈里面,在页面中获取到值栈数据 3、servlet和action的区别 前面讲action生命周期时已经提到: servl...

Java开发,人工智能,边缘计算,致力于掌握前沿技术 969

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Struts2中的值栈

什么是值栈 ValueStack是Struts2的一个接口,字面意义为值栈,OgnlValueStack是ValueStack的一个实现类,客户端发起一个请求struts2架构就会创建一个action实例同时创建一个OgnlValueStack值栈实例。OgnlValueStack贯穿整个Action的生命周期,struts2中使用OGNL将请求Action的参数封装为对象储存到值栈中,并通过ON...

weixin_40007271的博客 356

Struts2--值栈(ValueStack)

值栈 值栈(ValueStack)就是 OGNL 表达式存取数据的地方。在一个值栈中,封装了一次请求所需要的所有数据。 在使用 Struts2 的项目中,Struts2 会为每个请求创建一个新的值栈,也就是说,值栈和请求是一一对应的关系,这种一一对应的关系使值栈能够线程安全地为每个请求提供公共的数据存取服务。 1.值栈的作用: 值栈可以作为一个数据中转站在前台与后台之间传递数据,最常见的就是将 S...

吴声子夜歌的博客 599

struts2--关于值栈的概念性问题

重要参考:http://www.cnblogs.com/ningvsban/p/3739622.html http://www.cnblogs.com/ningvsban/p/3739682.html 结论: 1 狭义值栈   通常指的是实现com.opensymphony.xwork2.util.ValueStack接口的对象,目前就是com.opensymphony.x

nupt_Wang的专栏 1127

简单了解Struts2中的值栈

值栈对象 用户提交Action请求后系统当即创建Action实例和值栈对象,Struts2中的值栈ValueStack是一个接口,其实现类为OgnlValueStack。其中最重要的两个属性是CompoundRoot root(本质是ArrayList,值栈操作时视其为栈)和transient Map<String, Object> context(OgnlValueStack将创建的map的引用传递给context)。 Tips:transient关键字可以将一个类的指定属性忽略序列化传输..

WanAkiko. 248

java struts2值栈ognl_Struts2-值栈与OGNL

OGNL表示式使用 和 值栈OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。* xwork 提供 OGNL表达式* ognl-3.0.5.jarOGNL 是一种比EL 强大很多倍的语言OGNL 提供五大类功能1、支持对象方法调用,如xxx.doSomeSpecial();...

weixin_30857403的博客 219

Struts2:值栈

值栈 在学习web开发时,我们在servlet里面进行操作,把数据放到域对象里面,在页面中使用el表达式获取数据,域对象在一定范围内存值和取值。 struts2本身就提供一种存储机制,类似于域对象,叫值栈,用于存值和取值。 在action把数据放到值栈里面,在页面中获取到值栈数据。 servlet和action区别 Servlet:默认在第一次访问时候创建,创建一次,单实例对象。 Ac...

离开屏幕的光,哪盏灯照亮你的孤独? 224

快速入门Struts2㊁OGNL表达式,struts2标签,值栈

1 OGNL,Struts2标签,值栈? 2 采用OGNL+struts2标签+值栈 2.1 搭建项目环境 2.2 Action中向值栈存数据 2.3 JSP中从值栈取数据 3 本文代码资源下载 更多Struts2在框架开发 1 OGNL,Struts2标签,值栈? 传统Servlet中,通常要把数据放入域对象中,然后在JSP页面使用EL表达式+JSTL标签...

优快云 481

java 值栈的结构_Struts2笔记_值栈

A.值栈概述值栈(ValueStack),通俗的来说就是Struts2里面用来管理和存储数据的东西。struts2项目部署运行后,底层会创建一个action实例,同时也会在内存上划分一块区域,这个区域就是值栈,该值栈对象会贯穿整个Action生命周期,用来存储这个过程中的数据。B.值栈结构首先,我们一起去看看struts2中值栈在哪里。找到xwork-core--->com.opensymp...

weixin_33215027的博客 138
上一篇: (七)Struts2进阶之Action接收参数的三种方法
下一篇: (九)Struts2进阶之OGNL表达式第一弹
秃头哥编程
博客等级 码龄10年 805粉丝 270原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值