ContextMap、ActionContext以及ServletActionContext

ContextMap:它存了一次请求所需的所有数据,包括但不限于:

request--是一个map类型

session--一个map类型

application--一个map类型

valuestack(值栈)

action--表示当前执行的动作类实例,不用关心,因为在valuestack中有这个对象

parameters--包含了参数,但struts2中都是框架帮我们封装参数了,有modeldriven了,所以也不管

attr(page    request    session    application)--也不管


ActionContext:ContextMap是Map<String,Object>类型,所以从它里面获取的request,session,application都是Object类型。可是它们实际上都是Map类型,所以这时候一个工具类出现了--ActionContext,它帮我们封装好了方法,我们用它获取的request等就是Map<String,Object>类型,不需要我们再强转了。看它的源码可以知道,在它的构造方法中就将contextMap对象传进来了,然后再通过contextMap来获取对应对象。ActionContext对象在请求经过过滤器的时候创建,但是注意,只有那种action请求才会创建,普通的访问jsp\html这种请求过滤器直接放行了,是不会有actionContext对象创建的,actionContext对象创建以后会绑定到当前线程中,所以我们在后面的action类中直接通过ActionContext.getContext()就可以获取到当前线程的actionContext对象了。

ActionContext context = ActionContext.getContext();
Map<String,Object> app_map = context.getApplication();
		app_map.put("xixi", "xixixixixixixixxi");


ServletActionContext:专门拿servletAPI的一个工具类,继承了ActionContext.

	request = ServletActionContext.getRequest();
	response = ServletActionContext.getResponse();
	HttpSession session = request.getSession();
	application = ServletActionContext.getServletContext();

注:ActionContext和ServletActionContext都可以拿到servlet中对应的对象,但是ActionContext中有session而没有response,ServletActionContext有response没有session,需要拿session需要通过request.getSession()获取。

另外两种类获取到相应的对象类型不一样,ActionContext获取到的request,session,application都是Map<String,Object>类型,存数据都是用request.set("","")的形式,而ServletActionContext获取到的对象则是servlet中原生的域对象,存数据时用的  request.setAttribute("",""),其实可以把ActionContext方式获得的域对象看作是把原生的稍微封装了一下,来个栗子:

public class Dodebug extends ActionSupport {
	public String doDebug() {
		ActionContext context = ActionContext.getContext();
		
		ServletContext app_servlet = ServletActionContext.getServletContext();
		app_servlet.setAttribute("hehe","hehehehehehehehehehe");
		
		Map<String,Object> app_map = context.getApplication();
		app_map.put("xixi", "xixixixixixixixxi");
		
		System.out.println(app_servlet == app_map);
		return SUCCESS;
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值