Struts2的值栈深入理解

深入理解Struts2框架:特性、组件与创建应用 本文将深入探讨Struts2框架的核心概念,包括其主要特性、核心组件以及如何创建一个基于Struts2的应用程序。首先,我们将了解标签处理器和TLD文件在自定义标签中的作用,随后转向JSP中的错误处理和表达式语言。接下来,文章将重点介绍Struts2框架,包括其与Struts1的主要区别、核心特性、组件,以及创建应用程序的步骤。通过实例和详细的解释,我们将掌握Struts2的MVC架构和工作原理。 阅读详情

对Struts2这个框架用了很久,最近开发遇到一个关于值栈的问题,所以决定深入研究一下,

我们要知道OGNL只是显示数据的表达式语言

ValueStack值栈:存储数据的

研究源码:得到如下的理解

 

往对象栈(CompoundRoot extends ArrayList)中放数据

        //把departmentList放入到了对象栈的栈顶
        //ActionContext.getContext().getValueStack().push(departmentList);
        //把departmentList放入到了对象栈的栈顶
        //ActionContext.getContext().getValueStack().getRoot().add(0, departmentList);
        //把departmentList放入到了对象栈的栈底
        //ActionContext.getContext().getValueStack().getRoot().add(departmentList);
        //获取对象栈的栈顶的元素
        //ActionContext.getContext().getValueStack().peek();
        //移除对象栈的栈顶的元素
        //ActionContext.getContext().getValueStack().pop();
        //移除对象栈的栈顶的元素
        //ActionContext.getContext().getValueStack().getRoot().remove(0);
        //把一个map放入到对象栈的栈顶
        //ActionContext.getContext().getValueStack().set(key, o);      

* 对象栈的说明
         *    *  处于对象栈的对象中的属性是可以直接访问的
         *    *  如果在对象栈中有一样名称的属性,从栈顶开始查找,直到找到为止
         *    *  一般情况下,回显的数据应该放在对象栈中,这样效果比较高
         *    *  用ognl表达式访问对象栈,直接属性名称就可以了,不用加#

向map栈存放数据的方法

 

说明
         *   *  reuqest,session,application都在map栈中
         *   *  可以把一个对象放入到map中
         *   *  ognl表达式访问map栈中的内容
         *       如果一个对象在request中
         *          #request.对象的key值.属性
         *       如果一个对象直接放入到map中
         *          #对象的key值.属性
         *       把一个对象放入到map栈中,是不能直接访问该对象的属性

//#request.deparmentList
        //ServletActionContext.getRequest().setAttribute("departmentList", departmentList);

 list中含有list
//        List<List<Department>> lists = new ArrayList<List<Department>>();
//        Department department1 = new  Department();
//        department1.setDname("department1_name");
//        Department department2 = new  Department();
//        department2.setDname("department2_name");
//        List<Department> departmentList1 = new ArrayList<Department>();
//        departmentList1.add(department1);
//        List<Department> departmentList2 = new ArrayList<Department>();
//        departmentList2.add(department2);
//        lists.add(departmentList1);
//        lists.add(departmentList2);
//         list中含有map
//        List<Map<String, Department>> lists2 = new ArrayList<Map<String,Department>>();
//        Map<String, Department> map1 = new HashMap<String, Department>();
//        map1.put("d1", department1);
//        Map<String, Department> map2 = new HashMap<String, Department>();
//        map2.put("d2", department2);
//        lists2.add(map1);
//        lists2.add(map2);
//          map中含有list
//        Map<String, List<Department>> maps = new HashMap<String, List<Department>>();
//        maps.put("list1", departmentList1);
//        maps.put("list2", departmentList2);
//        ActionContext.getContext().put("maps", maps);

 

总结:    *  ValueStack是ognl存放数据的对象  

               *  得到ValueStack有三种方案          

                ActionContext.getContext().getValueStack()          

                 ServletActionContext.getValueStack(request);        

                request.getAttribute("struts.valueStack");    

*  ValueStack作用域为request    

*  当action创建的时候,ValueStack就创建了,当action被销毁时,ValueStack就销毁了

   *  ValueStack可以利用对象栈和map栈存放数据    

*  向对象栈中存放数据        

 ActionContext.getContext().getValueStack().push  栈顶   对象      

   ActionContext.getContext().getValueStack().add()  栈底  对象        

 ActionContext.getContext().getValueStack().add(index,object);

按照指定的位置存放在对象栈中          

ActionContext.getContext().getValueStack().set()  栈顶   Map    

*   向map栈中        

  request,session,application   setAttibute()   map-->_values--->requst,session,application          

ActionContext.getContext().put(key,value)  直接存放在map栈中

如何利用ognl表达式取ValueStack中的数据

* <s:property/>去栈顶的元素

* <s:iterator/> 取栈顶的元素

* s:iterator标签的value属性的值无论来自对象栈还是map栈,都可以不加#,s:select标签也适合

* 在s:iterator标签迭代的时候,把当前正在迭代的元素放入到栈顶

属性驱动:    

*  在action中,有属性,属性的名称和页面上form表单中的name的值对应    

*  属性必须有set和get方法  

 *  原理          在提交一个请求以后,action中的属性在栈顶。ParametersInterceptor拦截器          会把页面上的form表单的值获取,然后调出ValueStack,给栈顶的属性赋值。

模型驱动    *  StudentAction implements ModelDriver<Student>    *  在action中需要有一个私有的对象          private Student model = new Student();    *  原理         *  先经过ModelDriverInterceptor,作用是把model放入到栈顶         *  再经过ParametersInterrceptor,把栈顶的属性赋值     这两个拦截器不能颠倒执行

 

 

 

 

 

 

 

     <!-- 
                iterator说明
                  *  当前正在迭代的元素在栈顶
                  *  如果value属性不写,则默认迭代栈顶的元素
                  *  value值如果为top,则也是迭代栈顶的元素

             -->

<!-- 
                 list中含有list
              -->
              <!-- 
              <s:iterator>
                  <s:iterator>
                      <s:property value="dname"/>
                  </s:iterator>
              </s:iterator>
               -->
              <!-- 
                  list中含有map
               -->
               <!-- 
               <s:iterator value="#list">
                     <s:iterator value="top">
                         <s:property value="key"/>
                         <s:property value="value.dname"/>
                     </s:iterator>
               </s:iterator>
                -->
                <!-- 
                    map中含有list
                 -->
                 <!-- 
                 <s:iterator value="#maps">
                     <s:property value="key"/>
                     <!-- 
                         该迭代就是一个list
                      -->
                    <!-- 
                     <s:iterator value="value">
                         <s:property value="dname"/>
                     </s:iterator>
                 </s:iterator>
                  -->

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

深入理解Struts2框架笔记 本文还有配套的精品资源,点击获取 简介:Struts2是一个开源的JavaEE Web应用程序框架,基于MVC设计模式。本笔记深入讲解了Struts2的核心概念,包括Action类的工作原理、struts.xml配置文件的使用、结果类型和OGNL表达式语言的应用、表单提交的自动数据校验、以及与Spring框架的集成。此外,还讨论了Tiles模板技术和Struts2工具组件的... 阅读详情

相关推荐

遥感大模型的深度学习从CNN到Vision Transformer以及混合架构的演进之路

深度学习,特别是以卷积神经网络(CNN)和Transformer为代表的“大模型”技术,正以其强大的表征学习能力,深刻地重塑着遥感智能解译的整个技术栈与认知范式。本文将系统性地梳理遥感大模型从局部卷积的奠基,到全局注意力的革命,再到二者融合的混合架构演进这一波澜壮阔的历程。我们将深入剖析每个阶段的核心技术原理,结合遥感数据特性与实际应用案例,详细阐述其在分类、检测、分割等核心任务中的具体应用。

panshengwu的博客 1138

简单了解Struts2中的值栈

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

WanAkiko. 248

MacBook 本地化部署 Dify 指南

dify 怎么安装部署 有哪些坑 !

weixin_44542598的博客 1522

Struts2值栈详解

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

Switch的博客 9802

告别玄学调试:用STM32CubeMX和逻辑分析仪搞定DP83848的RMII与SMI接口

本文详细介绍了如何使用STM32CubeMX和逻辑分析仪调试DP83848的RMII与SMI接口,帮助开发者超越表象,直接观察底层通信波形。通过实战案例和高级调试技巧,解决常见问题如时钟偏移、信号完整性等,提升网络接口的稳定性和可靠性。

weixin_30752699的博客 299

四、zabbix7.0推送告警至钉钉webhook机器人

2、钉钉的webhook是有安全要求的,我采用的是ip的方式,我的zabbix服务器在内网,我的网络出口有多个固定公网ip,所以这样做省事,其他方式也可以你自己考虑。下图是webhook机器人的配置。这一步,参数里面默认的跟我下图里不一样的,按我下图修改。Key是你的webhook机器人地址里的access_token=后面的内容。整个逻辑就是告警动作匹配告警媒介与用户,然后进行告警的发送。1、zabbix服务器能够访问钉钉的服务器,具体说是能访问。二、zabbix7配置报警媒介以及消息模板配置。

m0_74823715的博客 1293

Struts2中值栈的理解

Struts2中值栈的理解   一、拦截器的初始化      如图所示呢,在一次请求过程中,拦截器首先会初始化一个值栈对象以供使用。初始化过程中,在Map对象里面放了request=,session=,application=,sttr=,parameters=,....;在Stack里放了action和其他一些对象(注意对象栈是先进后出,类似弹匣)。由此可见值栈的生命周期是一次请求。

Nickthink的博客 1万+

手把手教你用6轴IMU跑通LIO-SAM:参数配置与代码修改保姆级教程

本文提供了一套完整的6轴IMU适配LIO-SAM的解决方案,包括参数配置与代码修改的详细步骤。从理解6轴与9轴IMU的关键差异入手,逐步指导如何调整核心配置文件params.yaml、重构utility.h关键函数、优化mapOptimization.cpp的位姿融合逻辑,并给出编译验证与性能调优建议,帮助开发者快速实现6轴IMU在LIO-SAM中的稳定运行。

weixin_28717807的博客 357

在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等

    笔者不知道该用哪个词来形容ValueStack、ActionContext等可以在Struts2中用来存放数据的类。这些类使用的范围不同,得到的方法也不同,下面就来一一介绍。     声明:本文参考Struts2版本为2.3.1.2,内容仅供参考,限于笔者水平有限,难免有所疏漏,望您能友善指出。本文发表于ITEYE,谢绝转载。 1. ValueStack     ValueStack...

newton449的博客 381

DeerFlow 系列教程 第三篇 | 核心技术深度剖析:Skills、Memory 与 Context Engineering

摘要化是 Context Engineering 中最关键的组件——它直接决定了长对话的可用性。Skills 技能系统通过渐进式加载的三层模型,在保持系统提示词轻量的同时,支持无限数量的技能扩展。从发现到执行的 10 个生命周期阶段,配合 AI 驱动的安全扫描和多层缓存,构成了一个生产级的技能管理框架。Memory 长期记忆系统通过文件系统持久化、LLM 驱动的信息提取和防抖动异步更新,实现了跨会话的认知持久化。六类事实分类体系和修正信号检测机制,让 Agent 能够从交互中持续学习和改进。

weixin_43674738的博客 280

OpenHarmony WebView引擎:从Chromium魔改到分布式渲染的终极解析

ArkWeb框架提供了强大的Web应用开发能力,但同时也需要注意网络安全问题,尤其是跨域请求方面。

m0_67505153的博客 1196

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

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

程序员猫爪 2017

关于React Native Android找不到node的错误

最近,按照官方文档初始化了一个React Native项目,但是在Android端运行的时候,报了如下的一个错误。 org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:recordFilesBeforeBundleCommandDebug'. Caused by: org.gradle.process.internal.ExecException: A problem occurred starting p

xiangzhihong8的专栏 4246

struts2值栈深入理解

struts2值栈 值栈(ValueStack)是struts2中的一个重要的概念,几乎所有的Struts2操作都要同值栈打交道。那么值栈究竟是什么呢? 实际上struts2中的值栈就是一个存放对象的堆栈,对象以map的形式存储在这个堆栈中,并且该堆栈中的对象属性的数值可以通过表达式语言获得。     Struts 2Action类通过属性可以获得所有相关的值,如请求参数、Action配置参

seraph0222的专栏 1190

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深入理解struts2中的值栈

1.什么是值栈 (1)之前web阶段 在servlet里进行操作,把数据放到域对象中,然后在页面中使用el表达式获取到。域对象就是在一定范围内来存执和取值(属性作用范围)   (2)在struts2中 提供本身的一种存储机制(此前用servlet的对象),类似于域对象,叫做值栈。是可以存值和取值的 在action中把数据放到值栈中,然后在页面中获取到值栈数据   (3)servle

maoyuanming0806的博客 659

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深入理解struts2的值栈(转)

百度上的一篇文章,由于编码,转码规则不一样,转到这边后很多html标签,直接给大家一个链接: http://apps.hi.baidu.com/share/detail/31941919

yax405的专栏 630

03.Struts2值栈入门-01

03.Action参数以及值栈 1、获取HttpParamter对象 get():Paramter getValue: getMultipleValue: 2、在Action类中出现了数据类型转换失败,也没有任何提示,就失败了 ​ 如果没有继承ActionSupport则依旧能够正常访问。 3、ActionSupport类 Action类: 五个常量 SUCCESS NONE ERROR INPUT LOGIN 一个默认返回SUCCESS的execute方法 Validateable:验证方法

ycjcson的博客 186

Struts2学习记录-Value Stack(值栈)和OGNL表达式

只是学习记录,把我知道的都说出来 一,值栈的作用记录处理当前请求的action的数据。二,小例子有两个action:Action1和Action2 Action1有两个属性:name和passwd Action2有两个属性:name2和passwd2 请求从Action1进入,chain方法导向Action2 Struts.xml配置信息:<?xml version="1.0" encodi

老高是我 1632

Struts2框架学习笔记

1. Struts2简述        Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2框架前端的控制器就是过滤器。 注:Struts2的核心就是过滤器。 ...

qq_39080087的博客 323

Struts2要点复习之二

问题1.回忆如何配置Struts2可以受理的请求的扩展名2.Action默认配置的是什么类3.回忆result标签的配置,可以有几种配置,回忆如何配置 1.回忆如何配置Struts2可以受理的请求的扩展名 <constant name="struts.action.extension" value="action,do"></constant> 2.Action默认配置的是...

a1773570500的博客 195

Struct2入门四

OGNL表达式使用和值栈 1、 值栈在开发中应用 主流应用 : 值栈 解决 Action 向 JSP 传递 数据问题 Action 向JSP 传递数据处理结果 ,结果数据有两种形式 1) 消息 String类型数据 this.addFieldError("msg", "字段错误信息"); this.addActionError("Action全局错误信息"); thi

繁华落尽 359

OGNL—<s:property>各种用法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34092455的博客 138

struts2.1.6教程四、OGNL与ValueStack(VS)

1.值栈入门 下面我们建立struts2ognl项目来练习ognl的使用。 步骤一、搭建strust2的开发环境 步骤二、建立LoginAction,主要代码如下: package com.asm; public class LoginAction extends ActionSupport{ private User user; public String ex...

weixin_34273479的博客 80

SSH视频学习笔记

1.copy一个项目的时候,当运行新的一个项目时还是显示原来项目的路径时,需要修改如下信息方可运行: 2.如何把别人的项目引入自己的工作空间: 3.当copy别人的项目到自己的工作空间,项目不能运行,得修改相关信息 JRESystem library环境不一致,重新build 4.&lt;constant name="struts.devMode" va...

小桥 流水 人家 191

OGNL简介

今日目标: 了解struts的传值的优先级 OGNL介绍: 1,OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言 2,OGNL相当于一个上下文(OgnlContext)概念,就是一个Map结构(教室 老师 学生) 它实现了java.utils.Map 的接口。Struts框架默认就支持ognl表达式语言。(从struts项目必须引入ognl.jar包可以看出) 比如:Map 教室 OgnlContext=根对象..

m0_58525944的博客 1609

深入理解Struts2

简介  Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork

邵鸿鑫 3439
上一篇: hibernate的load方法在eclipse和idea中执行的区别以及解决办法
下一篇: id to load is required for loading原因关于ssh中模型驱动
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值