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

通过源码查看到:当请求过来的时候,执行过滤器当中的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

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

[外链图片转存中…(img-CikQ4uw0-1713343249265)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值