ContextMap、ActionContext以及ServletActionContext

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

request--是一个map类型

session--一个map类型

application--一个map类型

valuestack(值栈)

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

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

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


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

ActionContext context = ActionContext.getContext();
Map 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类型,存数据都是用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 app_map = context.getApplication();
		app_map.put("xixi", "xixixixixixixixxi");
		
		System.out.println(app_servlet == app_map);
		return SUCCESS;
	}
}

你可能感兴趣的:(struts2)