Struts2的值栈(ValueStack),详解+图解-程序员宅基地

技术标签: 程序员  java  struts  后端  

通过源码查看到:当请求过来的时候,执行过滤器当中的doFilter方法,在这个方法当中创建ActionContext,

在创建ActionContext的过程当中,创建ValueStack对象,将ValueStack对象传递给ActionContext对象。

所以我们可以通过ActionContext来获取值栈的对象

ActionContext这个对象之所以能够访问到Servlet的API(访问的是域对象当中的数据)。因为在其内部有值栈的引用

//获得值栈的对象

ValueStack valueStack = ActionContext.getContext().getValueStack();

4、获得值栈
(1)第一种:通过ActionContext对象来获取值栈对象。

在Struts2内部,将值栈存入到request中一份。

// 第一种:通过ActionContext获得:

ValueStack valueStack = ActionContext.getContext().getValueStack();

(2) 第二种:通过request对象来获得

// 第二种:通过request对象来获得

ValueStack valueStack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

(3) 测试两个对象是不是同一个对象

一个Action的实例,只会创建一个ValueStack的对象(一个ValueStack只会为一个Action服务)

public class ValueStackDemo2 extends ActionSupport {

@Override

public String execute() throws Exception {

// 第一种:通过ActionContext获得:

ValueStack valueStack1 = ActionContext.getContext().getValueStack();

// 第二种:通过request对象来获得

ValueStack valueStack2 = (ValueStack) ServletActionContext.getRequest()

.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

System.out.println(valueStack1 == valueStack2);

return NONE;

}

}

浏览器访问

在这里插入图片描述

表示两个方式获取的Action是同一个值栈对象

在这里插入图片描述

5、操作值栈-向值栈当中存入数据(Root当中)
(1)第一种:在Action当中提供属性的get方法的方式。

默认的情况下,将Action对象压入到值栈。Action都在值栈当中,那么Action的属性一定也在值栈当中。

/*

  • 操作ValueStack:方式一:利用Action本身在值栈当中本身的特性。

*/

public class ValueStackDemo3 extends ActionSupport {

private User user;

public User getUser() {

return user;

}

@Override

public String execute() throws Exception {

// 向ValueStack中去存值

user = new User(“李峰”, “222”);

return SUCCESS;

}

}

配置文件

在这里插入图片描述

jsp页面

在这里插入图片描述

可以在Root当中得到对应的user对象

在这里插入图片描述

在这里插入图片描述

(2)第二种:使用ValueStack当中本身的一些方法的方式。

import com.itzheng.struts2.domain.User;

import com.opensymphony.xwork2.ActionContext;

/*

  • 操作值栈:方式二:调用值栈当中的方法来进行实现。

*/

import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.util.ValueStack;

public class ValueStackDemo4 extends ActionSupport {

@Override

public String execute() throws Exception {

//向值栈保存数据:

//获得值栈对象

ValueStack valueStack = ActionContext.getContext().getValueStack();

//一般会使用值栈当中的两个对象

//使用push(Object obj); set(String key,Object obj);

User user = new User(“李四”,“121212”);

//压栈,user在栈顶的位置

valueStack.push(user);

return super.execute();

}

}

在这里插入图片描述

User在栈顶

在这里插入图片描述

注意:通过set的方式将输入放入到栈当中

谁最后调用谁就在最上面,创建了一个MAP集合,将MAP集合压入到栈当中

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6、获取值栈的是数据
(1)获取root当中的数据:不需要加#

获取值栈当中数据就是在页面当使用OGNL表达式即可。

获取对象的数据

在这里插入图片描述

在这里插入图片描述

浏览器页面上

在这里插入图片描述

保存并获取集合当中的数据

public class ValueStackDemo5 extends ActionSupport {

@Override

public String execute() throws Exception {

// 向值栈当中保存对象

User user = new User(“aaa”, “123”);

ActionContext.getContext().getValueStack().push(user);

// 同值栈中保存一个集合

List list = new ArrayList();

list.add(new User(“aaa”, “111”));

list.add(new User(“bbb”, “222”));

list.add(new User(“ccc”, “333”));

ActionContext.getContext().getValueStack().set(“list”, list);

return super.execute();

}

}

在这里插入图片描述

在这里插入图片描述

(2)获取context当中的数据:不需要加#

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(3)拓展内容

注意如果是arrt.name那么获取的是栈值当中的栈顶元素(也就是第一个元素)

在这里插入图片描述

parameters.id的作用是接收参加
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**

image
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
" alt=“img” style=“zoom: 33%;” />

最后

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**

[外链图片转存中…(img-jOjlKqxF-1713432148502)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_83817392/article/details/137929404

智能推荐

Mysql查询时截取某两字符串中间的内容_mysql截取两个字符中间的内容-程序员宅基地

文章浏览阅读414次。【代码】Mysql查询时截取某两字符串中间的内容。_mysql截取两个字符中间的内容

JDK17和 Springboot 版本_spring boot 2.6.6和jdk17-程序员宅基地

文章浏览阅读1.2k次。一、Unsupported class file major version 61。升级最新Jdk版本后,编译项目报错,因为当前Springboot版本过低。2.3.12.RELEASE 适配为JDK8-15。当前Springboot版本时间。最新版本为2.6.1 编译通过。_spring boot 2.6.6和jdk17

基于存档的多目标算术优化 (MAOA)附matlab代码_arithmetic optimization algorithm 改进-程序员宅基地

文章浏览阅读88次。Monoamine oxidase A (MAOA) is a mitochondrial enzyme that inactivates neurotransmitters of the monoamine family such as dopamine, serotonin, and norepinephrine. MAOA and MAOB are encoded by separate genes on the X chromosome and share 70% amino acid simila_arithmetic optimization algorithm 改进

定义time类,私有成员变量包括:hour、min、sec(int型)。_定义一个时间类,含有私有成员-程序员宅基地

文章浏览阅读4.2k次。定义time类,私有成员变量包括:hour、min、sec(int型)。公有成员函数(显示定义):1.带默认参数的构造函数。2.更改成员变量值的函数。3.友元函数addSecond(Time &t)。4.友元类B(B类中公有成员变量为time类的对象以及公有输出成员函数display()).主函数:创建一个time类对象t(构造函数初始化),利用友元函数addSecond(int s)增加100秒;在堆内存中创建一个B类对象并用指针指向它,将对象t的值赋值给B类对象的数据成员,利用友元类B的成员_定义一个时间类,含有私有成员

VTK中获取TextRenderer实例失败!_no text renderer available. link to vtkrenderingfr-程序员宅基地

文章浏览阅读54次。可视化工具包(Visualization Toolkit,VTK)是一个功能强大的开源软件库,用于处理和呈现科学数据的三维可视化。在使用VTK期间,有时候会遇到获取TextRenderer实例失败的问题。请注意,上述示例代码仅用于演示如何使用VTK绘制文本,并未考虑到获取TextRenderer实例失败的情况。如果问题仍然存在,请考虑在VTK的官方论坛或邮件列表中寻求帮助,以获取更详细的指导和支持。在使用VTK进行图形渲染和绘制时,某些情况下会遇到获取TextRenderer实例失败的错误。_no text renderer available. link to vtkrenderingfreetype to get the default

(四)STM32 操作 GPIO 点亮 LED灯 / GPIO工作模式_一个io引脚配置为开漏输出,引脚外接一个led上接3.3v,如果odr什么也不写,led会亮吗-程序员宅基地

文章浏览阅读800次。STM32 的 GPIO 模式,如何操作 IO 口的输出,输入_一个io引脚配置为开漏输出,引脚外接一个led上接3.3v,如果odr什么也不写,led会亮吗

随便推点

junit4 测试android,Android 开发 单元测试 (JUnit 4)-程序员宅基地

文章浏览阅读460次。什么是单元测试简单的说: 单元测试是为了测试某一个代码单元而写的测试代码;什么叫“一个代码单元”呢?是一个模块、还是一个类、还是一个方法(函数)呢?在面向对象编程中,是为了测试某一个类的某一个方法能否正常工作,而写的测试代码。单元测试不是集成测试这里需要强调一个观念,那就是单元测试只是测试一个方法单元,它不是测试一整个流程。两种函数(方法),两种不同的测试方式一个类的方法可以分为两种,一种是有返回..._androidjunit4.class

Golang | Leetcode Golang题解之第38题外观数列-程序员宅基地

文章浏览阅读460次。Golang | Leetcode Golang题解之第38题外观数列

c++多态案例三 组装电脑-程序员宅基地

文章浏览阅读112次。【代码】c++多态案例三 组装电脑。

tensorflow模型的保存和读取_怎么读取tf.variable-程序员宅基地

文章浏览阅读253次。数据的保存和读取import tensorflow as tfv1 = tf.Variable(tf.random_normal([1,2]), name="v1")v2 = tf.Variable(tf.random_normal([2,3]), name="v2")init_op = tf.global_variables_initializer()saver = tf.tra..._怎么读取tf.variable

office2016官方下载 免费完整版-程序员宅基地

文章浏览阅读848次。关于Office2016的最新信息微软公司于1月23日表示,Office2016最适合台式机使用。这款产品将于2015年下半年上市。微软Office产品管理团队总经理茱莉亚·怀特(Julia White)说:“我们今后几个月将分享Office 2016的更多信息,但这套软件仍将提供你所熟知的全方位Office体验,除了触控版本之外,Office 2016将会维持用户一直以来非常熟悉的Off...

基于HTML+CSS+JavaScript大学生静态后台管理7个页面(带JS商品删除)-程序员宅基地

文章浏览阅读1.1k次。????精彩专栏推荐 ????文末获取联系 ️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 ???? 关于作者: ????历任研发工程师,技术组长,教学总监; 十载寒冰,难凉热血;多年过去,历经变迁,物是人非。 然而,对于技术的探索和追求从未停歇。 ????坚持原创,热衷分享,初心未改,继往开来!????文章目录​​一、????‍????网站题目​​​​二..._h+框架的css,js,font等静态资源