Struts|Servlet对象获取的两种姿势

本文详细介绍了Struts2如何通过构造Map对象替代ServletAPI,以及访问Servlet对象的两种方式:借助ServletActionContext类和实现指定接口由Struts框架运行时注入。并提供了代码示例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 与 Servlet API 解耦的访问方式

为降低与 Servlet API 耦合, Struts2 构造 Map 对象来替代 servlet 对象(包括 HttpServletRequest、HttpSession 、 ServletContext ), 在 Action 中可直接使用 servlet 对象对应的 Map 对象来存取数据。

2 访问 servlet 对象的两种方式

(1)方式一:借助 ServletActionContext 类直接获取


ActionContext 是 Action 执行上下文环境,每个上下文基本上都是一个对象容器,包含了动作执行所需的对象(session、参数等)。ActionContext 是 threadlocal 的,存放在每个线程中的值唯一,线程安全。
ServletActionContext 直接继承 ActionContext,提供了直接与 Servlet 相关对象访问的功能,可取得的对象有:

(1)javax.servlet.http.HttpServletRequest : HTTPservlet请求对象
(2)javax.servlet.http.HttpServletResponse : HTTPservlet响应对象
(3)javax.servlet.ServletContext : Servlet上下文信息
(4)javax.servlet.ServletConfig : Servlet配置对象
(5)javax.servlet.jsp.PageContext : Http页面上下文
这些对象基本上都是通过静态方法来获得。

ActionContext 与 ServletActionContext 比较:
ActionContext 主要负责值的操作;ServletActionContext 主要负责获取 Servlet 对象。原则是:优先使用 ActionContext,只有 ActionContext 不能满足功能要求时才使用ServletActionContext,尽量使 Action 与 Web 无关,利于 Action 的测试和复用。需要注意:使用 ActionContext 时,不要在 Action 的构造函数里使用 ActionContext.getContext()。

(2)方式二:实现指定接口,由 struts 框架运行时注入

(与 Spring 框架的 ioc 原理相同)
实现 Aware 接口利用了依赖注入的方式能够让应用程序有更好的重用性。
Struts2 提供了4种分别用来访问 ServletContext、HttpServletRequest、HttpServletResponse、HttpSession 对象的接口

org.apache.struts2.util.ServletContextAware;
org.apache.struts2.interceptor.ServletRequestAware;
org.apache.struts2.interceptor.ServletResponseAware;
org.apache.struts2.interceptor.SessionAware;

依赖框架注入,故使用时,要提供对应的 set 方法。

代码示例:

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;

/*访问servlet对象
 * 方式二:实现指定接口,由struts框架运行时注入:
 */
public class DecoupleAction_2 extends ActionSupport implements
		ServletRequestAware, ServletResponseAware, ServletContextAware,
		SessionAware
{

	// 运行过程:
	// 构造方法--->setXXX方法--->execute()

	// 无参数的构造器
	public DecoupleAction_2()
	{

	}

	private HttpServletRequest request = null;
	private HttpServletResponse response = null;
	Map<String, Object> session = null;
	private ServletContext application = null;

	//提供setXXX方法,运行时,由框架注入
	public void setSession(Map<String, Object> session)
	{
		// TODO Auto-generated method stub
		this.session = session;
	}

	public void setServletContext(ServletContext application)
	{
		// TODO Auto-generated method stub
		this.application = application;
	}

	public void setServletResponse(HttpServletResponse response)
	{
		// TODO Auto-generated method stub
		this.response = response;
	}

	public void setServletRequest(HttpServletRequest request)
	{
		// TODO Auto-generated method stub
		this.request = request;
	}

	

	// action 入口
	@Override
	public String execute() throws Exception
	{
		System.out.println(request);
		request.setAttribute("username", "zhang in request.");

		System.out.println(response);

		System.out.println(session);
		session.put("username", "zhang in session.");

		System.out.println(application);
		application.setAttribute("username", "zhang in application.");

		return "success";
	}

	
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不甩锅的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值