热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Struts2中ActionContext与ServletActionContext的应用

本文将探讨如何在Struts2中使用ActionContext和ServletActionContext来获取请求参数和会话信息,同时解释它们的内部机制和最佳实践。

在开发基于 Struts2 的 Web 应用程序时,我们经常需要在 Action 中获取请求参数和会话信息。本文将详细介绍如何使用 ActionContext 和 ServletActionContext 来实现这一目标,并解释它们的内部机制和最佳实践。

首先,来看一个具体的需求:我们需要在 Action 中获取请求参数 “username” 的值。以下是实现这一功能的步骤:

1. 获取当前的 ActionContext 对象。
2. 从 ActionContext 中获取所有请求参数。
3. 从请求参数中提取所需的 “username” 值。

具体代码如下:

ActionContext cOntext= ActionContext.getContext();
Map params = context.getParameters();
String username = (String) params.get("username");

ActionContext 是 Action 执行时的上下文,可以看作是一个容器(实际上是一个 Map),用于存储 Action 在执行过程中需要的各种对象,如请求参数、会话信息、Servlet 上下文和本地化信息等。

每次执行 Action 之前都会创建一个新的 ActionContext,且 ActionContext 是线程安全的。这意味着在同一个线程中,ActionContext 的属性是唯一的,从而可以在多线程环境中安全使用。

我们可以通过 ActionContext 的静态方法 ActionContext.getContext() 来获取当前的 ActionContext 对象。以下是该方法的实现:

public static ActionContext getContext() {
ActionContext cOntext= (ActionContext) actionContext.get();
if (cOntext== null) {
OgnlValueStack vs = new OgnlValueStack();
cOntext= new ActionContext(vs.getContext());
setContext(context);
}
return context;
}

通常情况下,ActionContext 是通过 ThreadLocal 变量 actionContext.get() 获取的。ThreadLocal 为每个使用该变量的线程提供了一个独立的副本,使得每个线程可以独立地修改自己的副本,而不会影响其他线程。这确保了 ActionContext 的线程安全性。

接下来,我们看看如何通过 ActionContext 获取 HttpSession:

Map session = ActionContext.getContext().getSession();

这里返回的 session 是一个 Map 类型的对象,这是因为 WebWork 框架将 HttpSession 对象重新包装成了一个 Map 对象,以便于 Action 使用,而无需直接与底层的 HttpSession 交互。这种封装使得 Action 完全与 Web 层解耦。

如果我们的 Action 需要直接操作 JavaServlet 的 HttpServletRequest、HttpServletResponse 等对象,该怎么办?这时就需要使用 ServletActionContext。

ServletActionContext 继承了 ActionContext,并提供了直接访问 JavaServlet 相关对象的功能。它可以获取以下对象:

  • javax.servlet.http.HttpServletRequest:HTTP 请求对象
  • javax.servlet.http.HttpServletResponse:HTTP 响应对象
  • javax.servlet.ServletContext:Servlet 上下文信息
  • javax.servlet.ServletConfig:Servlet 配置对象
  • javax.servlet.jsp.PageContext:JSP 页面上下文

以下是几个简单的示例,展示如何从 ServletActionContext 获取 JavaServlet 的相关对象:

1. 获取 HttpServletRequest 对象:
HttpServletRequest request = ServletActionContext.getRequest();

2. 获取 HttpSession 对象:
HttpSession session = ServletActionContext.getRequest().getSession();

虽然 ServletActionContext 和 ActionContext 有一些重复的功能,但在 Action 中应尽量使用 ActionContext,以避免直接访问 JavaServlet 的相关对象。使用 ActionContext 时需要注意,不要在 Action 的构造函数中调用 ActionContext.getContext(),因为此时 ActionContext 中的某些值可能尚未设置,导致获取的值为 null。


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
author-avatar
e1985522z
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有