ValueStack

Strus2中关于ValueStack详解 什么是ValueStack它是一个接口com.opensymphony.xwork2.util.ValueStack。我们使用它是将其做为一个容器,用于携带action数据到页面。在页面上通过ognl表达式获取数据。 valueStack主要是将action数据携带到页面上,通过ognl获取数据1.ValueStack有一个实现类叫OgnlValueStack. 2.每一个action都有一个V 阅读详情
Struts2是通过ValueStack来进行赋值与取值的。
ValueStack实际上就是对OGNL的封装,OGNL主要的功能就是赋值与取值。

ValueStack中的数据,分两个部分存放:root和context
同时ValueStack暴露相关的接口(赋值和取值):
void setValue(String expr, Object value);
Object findValue(String expr);
通过OGNL表达式对ValueStack中的数据进行操作。

root

ValueStack中的root对象是CompoundRoot。
CompoundRoot继承了ArraryList,提供了额外的方法:push()和pop()方法,
用来对root对象中所包含的数据进行存取。
正是通过这两个方法,CompoundRoot变成了一个栈结构.
压栈操作,将导致对象被放到CompoundRoot的第0个元素上(第0个元素是栈顶),其它对象被依次往后移动;
出栈操作,将导致CompoundRoot的第0个元素被移除(即栈顶元素被弹出),其它对象被依次往前移动

OGNL只能访问被压入堆栈(CompoundRoot)中的元素。
在Struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入
ValueStack的CompoundRoot对象中。
所以Action对象是CompoundRoot对象中的一个元素,可以使用OGNL表达式直接访问。

在jSP页面中,使用<s:property value=”ognl表达式”/>标签,将CompoundRoot栈中的值取出。
在<s:property>标签中的OGNL表达式,最终会交给ValueStack来解释。
比如:"username"就是一个OGNL表达式,意思是调用root对象的getUsername()方法。



Context


由于在OGNL中,不支持多个root对象,但在struts2的OGNL的表达式中,
有可能需要访问到多个毫不相干的对象。这时候,我们把表达式中需要用到的对象放到Map中,
传递给OGNL,进行访问。这个Map对象,称为context。

可见valueStack对OGNL进行了扩展,使OGNL表达式可以访问到多个root对象。

要在表达式中访问到context中的对象,需要使用“#对象名称”的语法规则。
#表示将context对象的元素放入到CompoundRoot对象的栈顶。访问完后,
context对象的元素会从栈顶移出,自动释放。

当CompoundRoot栈中存在多个不相干的root对象时,使用 #root[n]. 进行访问,
n是root对象当前在栈中的顺序。从0开始。

请看下面的例子:

Java代码  收藏代码
  1. public class UserAction {  
  2.   
  3.     private String username;  
  4.   
  5.     //查看用户的详细信息  
  6.     public String detail(){  
  7.   
  8.        username = "张三";        
  9.   
  10.        List list = new ArrayList();  
  11.        for(int i=0; i<10; i++){  
  12.            User user = new User();  
  13.            user.setUsername("User"+i);  
  14.            list.add(user);  
  15.        }  
  16.   
  17.        ActionContext.getContext().put("users", list);        
  18.   
  19.        User u = new User();  
  20.        u.setUsername("赵毅");  
  21.        ActionContext.getContext().getValueStack().push(u);        
  22.   
  23.        return "detail";  
  24.     }  
  25.    


对应的JSP如下:

Java代码  收藏代码
  1. 行1:  <s:property value="username"/> <br/>  
  2. 行2:  <s:iterator value="#users">  
  3. 行3:     <s:property value="username"/>  
  4. 行4:     <s:property value="#root[2].username"/><br/>  
  5. 行5:  </s:iterator>  
  6. 行6:  <s:property value="username"/>  
  7. 行7:  <s:property value="#root[1].username"/> <!-- 张三 -->  


根据刚才的示例,我们知道,第1行的username是“赵毅”(因为JSP在执行这行代码的时候,CompoundRoot中有两个元素:第0个是“user对象赵毅”,第1个是“userAction对象张三”),因此第1行的username将取出CompoundRoot中第0个元素的username属性:赵毅

第2行代码是iterator标签,只定义了一个value属性,iterator标签将循环访问users这个List中的User对象,并把当前循环的user对象压入到CompoundRoot中!所以,在第3行和第4行代码被执行的时候,CompoundRoot中总共有3个元素:第0个元素是被iterator标签压入的当前循环的user对象;第1个元素是“user对象赵毅”;第2个元素是“userAction对象张三”,因此第3行代码的执行结果就是输出“UserX”,即当前循环的user对象的username属性!iterator标签将会依次取出List中的user对象,并不断压入/弹出user对象(每次循环,都将执行一遍压入/弹出)。而第4行代码取第2个元素的username属性,即userAction对象的username属性:张三。

第5行代码执行完成之后,在CompoundRoot中将剩下2个元素,与第2行代码被执行之前一样。所以,第6行代码的输出和第1行代码的输出结果是一样的,而第7行代码将取出userAction对象的username属性:张三

从传统扫描到SSN:Tessent数据包技术如何减少90%测试时间 本文深入探讨了Tessent流式扫描网络(SSN)如何通过其核心的数据包技术,彻底改变芯片测试范式。该技术将测试数据封装成标准化数据包,在共享总线上进行智能路由与分发,实现了动态带宽分配与核心独立测试,从而将复杂SoC(如AI芯片)的总体测试时间大幅削减90%,并显著提升测试灵活性与可扩展性。 阅读详情

相关推荐

【FPGA】AD9694调试注意事项

基于FPGA的AD9694设计及其注意事项,包括同步的设计注意事项

weixin_41246509的博客 2903

struts ValueStack 详解

一、ValueStack     1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用         实现了ValueStack接口的类OgnlValueStack.它是ValueStack的默认实现类.    2.ValueStack贯穿整个action的生命周期,每一个actio

下木的博客 8866

Rancher操作手册(v2.7.5-rc1)

选择需要创建ingress的命名空间 ==》填写ingress名称 ==》在“规则”一栏,选择“Prefix” ==》输入访问路径 ==》选择访问路径对应的service ==》如果需要继续添加访问路径,点击“添加路径”,重复前面的步骤即可。选择需要创建Deployment的命名空间 ==》填写Deployment名称 ==》选择通用 ==》填写容器名称 ==》填写镜像 ==》选择镜像的拉取密文 ==》点击添加端口或Service。点击左侧菜单栏的集群里的“项目/命名空间”,点击右下角的“创建命名空间”。

weixin_60197334的博客 5571

valuestack的工作原理

今天在为同事解决问题的时候,发现了自己以前对valuestack的理解有点偏差,通过问题的解决,也体验了一把温故而知新  废话少说,步入正题 当访问一个action的时候,此时struts2会把整个action压入valuestack的顶部,此时valuestack就一个action对象   我们通常会写stack.set(key1,value1) 或者statck.setvalue(

pwlazy的专栏 1万+

迈创Cameralink采集卡与MIL软件集成开发实战指南

本文详细介绍了迈创Cameralink采集卡与MIL软件的集成开发实战指南,涵盖硬件安装、驱动配置、MIL软件深度设置及图像采集处理等关键步骤。特别适合工业视觉检测和医疗影像领域,通过优化配置和性能调优,实现高速稳定的图像处理。

weixin_29204205的博客 423

【同花顺公式编辑教程】第4章 功能函数

本章节主要给出大部分能够运行且常用的同花顺指标编辑器提供的函数。其中,计算类函数不作演示,绘图类函数提供示例及示例运行结果。

LiaoYi2016218的博客 2万+

ValueStack理解与实践

    ValueStack对象是Struts2中一个重要的对象,它贯穿整个Action的生命周期,每个Action类的对象实例会拥有一个ValueStack对象。      在ValueStack对象中主要封装了两个对象,一个是Context,另一个是栈。其中Context是一个Map对象,其操作方法主要是put()与get()方法;而栈是一种只能在一端进行插入和删除操作的特殊线性表。它按照后...

小强博客 255

从零到一:YOLOv8在边缘设备上的轻量化部署实战

本文详细介绍了YOLOv8在边缘设备上的轻量化部署实战,涵盖模型优化、TensorRT加速、剪枝与知识蒸馏等关键技术。通过工业质检和智能门禁项目案例,展示了如何将YOLOv8高效部署到树莓派、Jetson Nano等资源受限设备,显著提升推理速度和降低内存占用。文章还提供了动态分辨率调整、多模型级联部署等实用技巧,助力开发者实现边缘AI应用的高效落地。

weixin_29040367的博客 379

关于ValueStack的介绍

当Action设置了某个属性值后,struts2将这些属性值全部封在一个叫struts.valuestack的请求属性里。在JSP页面中输出需要的信息可以通过如下代码来获取包含全部输出信息的ValueStack对象 request.getAttribute("struts.valuestack"); 可以通过OGNL表达式非常方便的访问该对象封装的信息。 从数据结构上看,ValueStack有点类似于Map的结构,但它比Map结构更加强大。Action中所有的属性都被封装到了ValueSt...

py编程|爱分享 1万+

发那科机器人通信库使用指南与踩坑记录

GitHubNuGet(如本文基于该库,在 C# / .NET 下通过 TCP 与 FANUC 机器人控制器通信,实现读当前位姿、PR 寄存器、以及 DI/DO/GI/GO 等 IO 的读写。GitHubNuGet(如本文基于该库,在 C# / .NET 下通过 TCP 与 FANUC 机器人控制器通信,实现读当前位姿、PR 寄存器、以及 DI/DO/GI/GO 等 IO 的读写。

songhuangong123的博客 323

YOLOv8 Neck改进:BiFPN双向特征金字塔网络解析与实践

本文详细介绍了如何在YOLOv8中集成BiFPN双向特征金字塔网络,包括原理解析、代码实现、配置文件修改和性能分析。BiFPN通过双向特征融合和加权特征机制,显著提升了多尺度目标检测的性能。希望通过本文的讲解,大家能够深入理解BiFPN的工作原理,并成功将其应用到自己的目标检测项目中。如果你有任何问题或建议,欢迎在评论区留言讨论!在下一篇文章中,我们将探讨YOLOv8的其他改进技术,包括注意力机制、新的损失函数等,敬请期待!

QQ_778132974的博客 991

Struts2中valueStack的使用

1.valueStack简介 我们使用valueStack的主要目的是为我将我们action中产生的数据携带到页面上,也就是说valueStack它就是一个容器。 在Struts2框架中将valueStack设计成一个接口:com.opensymphony.xwork2.util.ValueStack 我们主要使用的是它的实现类:com.opensymphony.xwork2.ognl.OgnlV...

BullZeng的博客 1128

直捣黄龙~

这篇文章描述了一个矩阵寻路问题,要求计算从起点到终点的最短路径数量及长度。主要思路是通过BFS算法解决:首先标记哨兵警戒区域为禁区,然后从起点出发进行广度优先搜索,记录每个位置的最短步数和路径条数。当到达终点时,输出路径数和步数;若不可达则返回(0,0)。算法使用队列实现BFS,同时处理路径统计和步数记录,适用于网格寻路类问题。

面试高手的博客 216

Struts2中的ValueStack

Struts2中的ValueStack 一、值栈   值栈(ValueStack)是Struts 2 的一个核心概念,类似于正常的栈,符合后进先出的栈特点,可以在值栈中放入、删除和查询对象。Struts 2对OGNL进行了扩充,将值栈作为OGNL的根对象。 ValueStack实际上就是对OGNL的封装,OGNL主要的功能就是赋值与取值,Struts2正是通过ValueStack来进行赋

jiangtongcn的专栏 2147

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

关于ValueStack

关于ValueStack的描述: 1、 ValueStack其实就是一个放置Java对象的堆栈而已,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。 2、 EL,全称Express Language,即表达式语言。不要被语言吓倒,它是简单的对象导航语言。有字符串(例如:方法名)和特殊字符组成(例如用.表示调用对应的属性方法)。通过EL,我们可以存...

软件人生 177

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ValueStack的使用

一、ValueStack     1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用         实现了ValueStack接口的类OgnlValueStack.它是ValueStack的默认实现类.    2.ValueStack贯穿整个action的生命周期,每一个action实例都

qq_33726754的博客 531

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Struts2值栈ValueStack介绍

ValueStack(值栈): 贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个ValueStack对象,每次请求都会创建一个Action类)。请求完成后ValueStack与request将一起消失。ValueStack相当于一个数据的中转站. 在其中保存当前Action 对象和其他相关对象.ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上

一个无限死循环的博客 398

ValueStack对象概述

ValueStack对象概述 ValueStack 是 Struts 的一个接口,字面意义为值栈 OgnlValueStack 是 ValueStack 的实现类,客户端发起一个请求 struts2 架构会创建一个action 实例同时创建一个OgnlValueStack 值栈实例, OgnlValueStack贯穿整个 Action 的生命周期。 请求访问的时候会加载三个东西: ...

Kato_op的博客 788

Struts2中值栈ValueStack的使用

Struts2中值栈ValueStack的使用 1、什么是值栈? 值栈ValueStack是Struts的一个接口,字面意义为值栈,OgnlValueStack是ValueStack的实现类。 当客户端发起一个请求时,Struts2架构会创建一个action实例对象,同时也会创建一个OgnlValueStack值栈实例对象,这个值栈对象将会贯穿整个Action的生命周期。 Struts2中使用OGNL将请求Action的参数封装为对象,存储到值栈中,可以通过OGNL表达式读取值栈中对象的属性值。 注意:

pipizhen_的博客 355

Struts2中的ValueStack详解

ValueStack的生命周期 ValueStack的是保存着request的请求域中的,因此它的生命周期与request的生命周期是相同的。

不会停下学习的脚步,重在思考。 4858

Struts Ongl valueStack与ActionContent.ValueStack的区别

最近一直在研究valueStack与ActionContent之间的区别 valueStack (值栈)是一个集合中的几个对象保持下列对象提供的顺序:值栈可以通过JSP,Velocity或者Freemarker的标签。有各种不同的标签在单独的章节中,我们将学习,用于获取和设置Struts 2.0 的值栈。 ValueStack的对象里面可以得到动作如下: valueStack中

林羽枫 1708

struts2-ValueStack详解

想要了解OGNL,首先要搞清楚ValueStack(值栈)的概念。如下图所示,value即所谓ValueStack对象。 可以看出,ValueStack分为两个逻辑部分 Map栈。实际上是 OgnlContext 类型,是个 Map,也是对 ActionContext 的一个引用.。里边保存着各种 Map:requestMap, sessionMap, applicationM

wh102445的专栏 499

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

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

程序员猫爪 2017

深度解析Struts2中ValueStack

对于每一个action的调用,Struts在执行相应的动作方法之前会先创建一个名为ValueStack的对象

不能说的秘密的博客 1万+
上一篇: ActionContext、ValueStack、OGNL
下一篇: Struts2自定义类型转换
randomnet
博客等级 码龄19年 59粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值