在Struts2中,进行业务控制的类就是普通的java类,只是在类中有一个业务控制的方法execute()(实际上该方法也可在struts.xml的action元素指定),这样实现了将Action与Servlet Api进行了分离,极大地降低了框架与Sevlet api的耦合度,便于业务控制器的测试。但这样一来,Servlet经常用到的request、session、application等就无法在业务控制中使用了,为使Action类能访问Servlet Api,struts2框架提供了ActionContext类和ServletActionContext.
1.ActionContext(com.opensymphony.xwork.ActionContext)类
ActionContext类是Action执行时的上下文,Action运行时所用到的对象都保存在ActionContext中,例如请求的参数、Session和本地化信息等。ActionContext是线程安全的,在每次执行Action前创建新的ActionContext对象,代码如下:
ActionContext context=ActionContext.getContext();
获取request、session、application对象方法如下:
Map session=ActionContext.getContext().getSession();
Map application =ActionContext.getContext().getApplication();
Map request=ActionContext.getContext().get("request");
注意:利用ActionContext 获得的request、session并不是HttpServletRequest、HttpSession类型,而是Map类型,例如将session类型封装成Map类型代码如下 :
Map map = new SessionMap(request);
public class SessionMap extends AbstractMap{
private HttpSession session;
public RequestMap(HttpServletRequest request){
this.session = request.getSession();
}
public void put(Object key,Object value){
session.setAttribute(key.toString(),value);
}
public Object get(Object key){
return session.getAttribute(key.toString());
}
}
ServletActionContext类是ActionContext的子类,该类可以直接返回Servlet api中的相应的servlet类型,代码如下:
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getRession();
HttpSession session=ServletActionContext.getReqeust().getSession();
说明:ActionContext能够实现的功能,尽量不要使用ServletActionContext,尽量不要让Action直接访问java servlet对象。