通过源码查看到:当请求过来的时候,执行过滤器当中的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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/c33fd06323c3f79f30ec302f5c462488.jpeg)
最后
终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/c33fd06323c3f79f30ec302f5c462488.jpeg)
最后
终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化
[外链图片转存中…(img-CikQ4uw0-1713343249265)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!