作者:e1985522z | 来源:互联网 | 2024-11-18 15:28
本文将探讨如何在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。