ActionContext类-与Servlet API解耦的访问方式

来源:互联网 发布:javascript隐藏按钮 编辑:程序博客网 时间:2024/05/17 04:59

非IOC方式

为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession、ServletContext对应的Map对象来保存和读取数据。要获得这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类。

public Object get(Object key)
    ActionContext类没有提供类似getRequest()这样的方法来
获取封装了的HttpServletRequest的Map对象。要得到request对象的Map对象,
需要为get()方法传递参数“request”


public Map getSession()
获得封装了HttpSession的Map对象


public Map getApplication()
获取封装了ServletContext的Map对象


public class LoginAction implements Action {

//在这里展示了,如何将用户登对录对象写入到request,session,application作用域中
public User user;
public String execute() throws Exception {
   ActionContext context=ActionContext.getContext();
  Map request=(Map)context.get(“request”);//获得request对象,只可以设置或是获取属性,不能获取参数。
   Map session=(Map)context.getSession();
   Map application=(Map)context.getApplication();
   request.put(“user”,user);//将user对象放到request作用域中
   session.put(“user”,user);//将user对象放到session作用域中
   application.put(“user”,user);//将user对象放到application作用域中

}


IOC方式
        除了利用ActionCotext来获取request、session、application对象这种方式外,还可以采用在Action类中实现某些特定的接口的方式,让Struts2框架在运行时向Action实例注入request、session和application对象,与之有关的三个接口和它们的方法如下所示:

org.apache.struts2.interceptor.RequestAware
    框架利用该接口,向Action实例注入request Map对象。该接口有
void setRequest(Map request) 

org.apache.struts2.interceptor.SessionAware
 框架利用该接口,向Action实例注入session Map对象。该接口有;
void setSession(Map session)

org.apache.struts2.interceptor.ApplicationAware
 框架利用该接口,向Action实例注入application Map对象。该接口有
void setApplication(Map application)