非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)