通过源码查看到:当请求过来的时候,执行过滤器当中的doFilter方法,在这个方法当中创建ActionContext,
在创建ActionContext的过程当中,创建ValueStack对象,将ValueStack对象传递给ActionContext对象。
所以我们可以通过ActionContext来获取值栈的对象。
ActionContext这个对象之所以能够访问到Servlet的API(访问的是域对象当中的数据)。因为在其内部有值栈的引用
//获得值栈的对象
ValueStack valueStack = ActionContext.getContext().getValueStack();
在Struts2内部,将值栈存入到request中一份。
// 第一种:通过ActionContext获得:
ValueStack valueStack = ActionContext.getContext().getValueStack();
// 第二种:通过request对象来获得
ValueStack valueStack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
一个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是同一个值栈对象
默认的情况下,将Action对象压入到值栈。Action都在值栈当中,那么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对象
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集合压入到栈当中
获取值栈当中数据就是在页面当使用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();
}
}
注意如果是arrt.name那么获取的是栈值当中的栈顶元素(也就是第一个元素)
parameters.id的作用是接收参加
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
" alt=“img” style=“zoom: 33%;” />
现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**
[外链图片转存中…(img-jOjlKqxF-1713432148502)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
文章浏览阅读414次。【代码】Mysql查询时截取某两字符串中间的内容。_mysql截取两个字符中间的内容
文章浏览阅读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
文章浏览阅读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 改进
文章浏览阅读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的成员_定义一个时间类,含有私有成员
文章浏览阅读54次。可视化工具包(Visualization Toolkit,VTK)是一个功能强大的开源软件库,用于处理和呈现科学数据的三维可视化。在使用VTK期间,有时候会遇到获取TextRenderer实例失败的问题。请注意,上述示例代码仅用于演示如何使用VTK绘制文本,并未考虑到获取TextRenderer实例失败的情况。如果问题仍然存在,请考虑在VTK的官方论坛或邮件列表中寻求帮助,以获取更详细的指导和支持。在使用VTK进行图形渲染和绘制时,某些情况下会遇到获取TextRenderer实例失败的错误。_no text renderer available. link to vtkrenderingfreetype to get the default
文章浏览阅读800次。STM32 的 GPIO 模式,如何操作 IO 口的输出,输入_一个io引脚配置为开漏输出,引脚外接一个led上接3.3v,如果odr什么也不写,led会亮吗
文章浏览阅读460次。什么是单元测试简单的说: 单元测试是为了测试某一个代码单元而写的测试代码;什么叫“一个代码单元”呢?是一个模块、还是一个类、还是一个方法(函数)呢?在面向对象编程中,是为了测试某一个类的某一个方法能否正常工作,而写的测试代码。单元测试不是集成测试这里需要强调一个观念,那就是单元测试只是测试一个方法单元,它不是测试一整个流程。两种函数(方法),两种不同的测试方式一个类的方法可以分为两种,一种是有返回..._androidjunit4.class
文章浏览阅读460次。Golang | Leetcode Golang题解之第38题外观数列
文章浏览阅读112次。【代码】c++多态案例三 组装电脑。
文章浏览阅读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
文章浏览阅读848次。关于Office2016的最新信息微软公司于1月23日表示,Office2016最适合台式机使用。这款产品将于2015年下半年上市。微软Office产品管理团队总经理茱莉亚·怀特(Julia White)说:“我们今后几个月将分享Office 2016的更多信息,但这套软件仍将提供你所熟知的全方位Office体验,除了触控版本之外,Office 2016将会维持用户一直以来非常熟悉的Off...
文章浏览阅读1.1k次。????精彩专栏推荐 ????文末获取联系 ️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 ???? 关于作者: ????历任研发工程师,技术组长,教学总监; 十载寒冰,难凉热血;多年过去,历经变迁,物是人非。 然而,对于技术的探索和追求从未停歇。 ????坚持原创,热衷分享,初心未改,继往开来!????文章目录一、????????网站题目二..._h+框架的css,js,font等静态资源