ActionContext

article/2025/11/1 11:50:56

1、ActionContext翻译成中文就是Action的上下文(为什么说是上下文,是应为他的生命周期长,和我们的项目的生命周期是相同的,我们很多公共的东西都放在里面,方便存取 )ActionContext是struts2的上下文对象。

2、ActionContext其本质就是一个容器,是一个Map结构的对象。

3、ActionContext 是 Action 的上下文,存放 Action 执行过程中数据信息。ActionContext 存放 Action 的数据,ActionInvocation, request 的数据, session的数据,application 的数据,locale 的数据,conversion errors 等。每次请求时会为当前线程创建一个 新的ActionContext 。 而 ActionContext 采 用 了 ThreadLocal 的 方 式 来 存 放 ActionContext 所以 ActionContext 是线程安全

4、 ActionContext贯穿于整个Action的执行生命周期。每次接受请求后都会新建一个ActionContext对象,将ServletAP中的数据存入到ActionContext中实现struts2和servlet的解耦。由于每次请求都重新创建ActionContext对象,导致执行效率比servlet更低。

5、解耦的好处: 测试Servlet每次都需要启动容器,就是启动服务器,应为Servlet依赖于容器。但是struts2有了ActionContext它就和servlet解耦了,两者之间就没有关系了,游览器请求的数据全部放在了ActionContext里面,struts2拿到了数据后,一旦进入到struts2的执行流程后,后面都不需要servlet,就可以运行,使得测试可以不依赖于容器(测试需要专门发起请求的工具)。

6、获取 ActionContext ActionContext.getContext()获取。由于 ActionContext 是线程安全的,并且是通过静态方法获取的,所以在本线程中的非 Action 类中也可以直接访问。

7、注意点:ActionContext 是基于请求创建的,所以在非请求的线程中是不能使用 ActionContext 对象的。如:filter 的 init()方法。

8、 源码分析

 

 

每次请求都会创建一个 ActionContext

 

 

 把5个区域的值存入ActionContext中

 还有一个值栈

 

9、、ActionContext 中包含 6 大对象 

 

 

request: 这里的request和servlet中的request不一样,它是一个Map结构,存放HttpServletRequest域中的数据。HttpServletRequest里面有两种数据,请求+手动放入的(通过setAttribute方法),但是这里的request仅仅只是存放的手动设置的数据。(request比较特殊)

session: 和servlet里面的session一样,存放的是HttpSessin域中的数据。

application: 和servlet里面的ServletContext一样,存放的是ServletContext域中的数据。

parameters:存放的是请求参数。

attr:存放的是  request session  application(也比较特殊)   attr(page-->request--->session--->application)

ValueStack(值栈):存放的是业务处理类的相关数据(属性)。

比如我的一个User对象它会被放入值栈

 attr存取的是page-->request--->session--->application  先找到的那个数据

查看AttributeMap可以看到

  public Object get(Object key) {PageContext pc = getPageContext();if (pc == null) {   //PageContext里面找不到Map request = (Map) context.get("request");Map session = (Map) context.get("session");Map application = (Map) context.get("application");if ((request != null) && (request.get(key) != null)) {//request里面找return request.get(key);//找到就返回} else if ((session != null) && (session.get(key) != null)) {//同理return session.get(key);} else if ((application != null) && (application.get(key) != null)) {return application.get(key);}} else {try{return pc.findAttribute(key.toString());}catch (NullPointerException npe){return null;}}return null;}

 


http://chatgpt.dhexx.cn/article/JTtmEVfZ.shtml

相关文章

readonly option is set (add ! to override)错误的解决

在mac电脑或linux系统中经常操作修改某个文件后保存退出出现readonly option is set (add ! to override)。如图: 正常情况下按 A进入编辑模式修改文件后按ESC退出编辑模式,:wq命令保存退出,但经常会遇到以上显示,文件权限只读或者…

ByteBuffer的allocate和allocateDirect

在Java中当我们要对数据进行更底层的操作时,通常是操作数据的字节(byte)形式,这时常常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式: Java代码 public static ByteBuffer allocate(int capacity…

直接内存 直接内存的释放和回收

直接内存 特点 不属于Java虚拟机管理,属于系统内存;属于操作系统,常见于NIO操作时,比如ByteBuffer【】用于数据缓冲区分配回收成本较高,但读写性能高;不受JVM内存回收管理 文件读写过程 java不具备磁盘…

解决The‘Access-Control-Allow-Origin‘ header contains multiple values‘*, ....‘, but only one is allowed

报错内容: Access to XMLHttpRequest at ‘http://www.z…n.com/api/login’ from origin ‘http://z…n.com’ has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ header contains multiple values ‘*, http://z…n.com’, but only one is …

C++中std::allocator的使用

标准库中包含一个名为allocator的类,允许我们将分配和初始化分离。使用allocator通常会提供更好的性能和更灵活的内存管理能力。 new有一些灵活性上的局限,其中一方面表现在它将内存分配和对象构造组合在了一起。类似的,delete将对象析构和内…

alloc的流程

1⃣️ 2⃣️ 3⃣️ 现在我们看的objc源码都是2.0的版本,之前还有一个1.0的版本 4⃣️ 5⃣️核心方法 最主要的就是最下面三个方法 他的最重要作用就是开辟内存 cls->instanceSize 先计算出需要的内存空间大小这个大小只和对象的成员变量有关 在没有成员变量…

ByteBuffer.allocate()与allocateDirect()的区别

allocate()产生的是HeapByteBuffer的实例, 本质上是一个no direct buffer, allocateDirect()产生的是DirectByteBuffer的实例, 本质是一个direct buffer 主要区别 buffer的创建方式不同, no direct buffer还可以通过封装已存在的byte array来产生执行IO操作时不同, no direct …

ByteBuffer常用方法与分析

目录 目标 常用API 工具方法 演示案例 allocate(int capacity)和allocateDirect(int capacity) put()和get() flip()和hasRemaining() clear() compact() wrap() 总结 目标 掌握ByteBuffer常用方法,分析ByteBuffer对象在切换读写模式的情况下基本属性的变…

allocate与allocateDirect的性能测试

allocate与allocateDirect的性能测试 测试工具JMH测试代码JMH结果结论 测试工具JMH java基准测试框架 测试代码 直接分配系统内存(allocateDirect) -测试申请内存性能JVM堆分配内存(allocate)-测试申请内存性能直接内存-操作-连续二十次添加(allocateDirect)-测试内存操作性能…

ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别

在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式: public static ByteBuffer allocate(int capacity) public s…

8、ByteBuffer(方法演示2(allocate堆内存和allocateDirect直接内存))

ByteBuffer(方法演示2(allocate堆内存和allocateDirect直接内存)) Allocate:java堆内存:读写效率低,收到gc的影响(因为我们的java对象也是存在堆内存的) !!…

03 Java NIO allocateDirect()和allocate()区别

03 Java NIO allocateDirect和allocate区别 allocateDirect()和allocate()区别直接与非直接缓冲区直接与非直接缓冲区 源码分析 allocateDirect()和allocate()区别 allocateDirect:分配直接缓冲区,将缓冲区简历在物理内存中,可以提交效率 all…

ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别。

在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式: public static ByteBuffer allocate(int capacity) public …

ByteBuffer中的allocate和allocateDirect

1、区别 allocate方法创建的内存在jvm的管理范围,而allocateDirect方法创建的内存不由jvm管理,意思就是allocateDirect创建的内存由系统直接管理 2、释放 allocateDirect创建的内存不归jvm管理,那如何释放呢?虽然这块内存不属于…

NIO ByteBuffer的allocate与allocateDirect区别(HeapByteBuffer与DirectByteBuffer的区别)

参考:https://blog.csdn.net/zhxdick/article/details/81084672 其中allocateDirect分配的字节缓冲区用中文叫做直接缓冲区(DirectByteBuffer),用allocate分配的ByteBuffer叫做堆字节缓冲区(HeapByteBuffer).. 其实根据类名就可…

【系统分析师】论文

文章目录 一、论文框架二、相关素材概览2.1 常见开发模型2.2 SOA架构 三、注意事项3.1 岗位职责3.2 项目背景3.3 理论部分讨论3.4 主体内容3.5 结论部分 四、范文4.1 开发模型主题反例正例 4.2 需求获取技术反例正例 4.3 系统测试反例正例 4.4反例正例 一、论文框架 二、相关素…

系统分析员论文12篇合集

系分论文1 企业人事信息系统的应用 【摘要】 本文讨论《企业人事信息系统》项目的需求分析方法与工具的选用。该系统的建设目标是帮助该企业管理好企业内部的人员和人员的活动,人事信息管理指的是企业员工从招聘面试到离职退休的全过程,涉及的主要活动…

系统分析师近几年论文走向

下面是整理的近几年的系统分析师考试论文题目

Java小游戏-俄罗斯方块

摘 要 随着时代的不断发展,个人电脑也在不断普及,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或工作之余休闲娱乐的首选,从最开始的Windows系统自带的黑白棋、纸牌、扫雷等游戏开始,到现在目不暇接的各种游戏&#xff0…