struts2进阶篇(4)
一、使用ActionContext访问Servlet API
strtus2提供了一个ActionContext类,该类别称为Action上下文或者Action环境,Action可以通过该类来访问最常用的Servlet API,该类提供了常用的方法在这做简单介绍:
>getContext();静态方法,获取当前对象的ActionContext实例。
>getSession();返回一个Map对象,该对象模拟了session作用域。
>getApplication();返回一个Map(),该对象模拟了application作用域。
>get(String key);对该方法传入"request"参数,即可返回一个Object对象,该对象模拟了request作用域。
>getParameters();返回一个map()对象,该对象中保存了浏览器上传的参数。
struts2不再依赖HttpServletRequest这样的传统Servlet API类型来获取request,session,application对象,这种方式称“解耦合”;
// action方法中解耦合方式获取request对象 Map<String ,Object> request = (Map<String,Object> ActionContext.getContext().get("request")); // action方法中或取session作用域对象 Map<String,Object> session = ActionContext.getContext().getSession(); // action方法中获取application对象作用域 Map<String,Object> application = ActionContext().getContext().getApplication();
二、使用Ioc的方式访问Servlet API
action类中只保留使用这些对象的代码,而获取对象的代码有struts2来实习,struts2获取这些对象后,再把这些对象注入Action类中,Action类即可使用这些对象,这种实现的思想就是著名的Ioc.
package action; import java.util.Map; import org.apache.struts2.interceptor.ApplicationAware; import org.apache.struts2.interceptor.RequestAware; import org.apache.struts2.interceptor.SessionAware; public class UserActions implements RequestAware, SessionAware, ApplicationAware { private Map<String ,Object> request; private Map<String,Object> session; private Map<String,Object> application; @Override public void setApplication(Map<String, Object> arg0) { this.request = request; } @Override public void setSession(Map<String, Object> arg0) { this.session = session; } @Override public void setRequest(Map<String, Object> arg0) { this.application = application; } }
说明:
上面的这段代码中,Action实现了RequestAware,SessionAware,ApplicationAware接口,这样Struts2就可以为该Action注入request,session,application对象了,以session为例子,struts2取得session对象,当UserAction对象被创建后,Struts2会判断UserAction是否实现了SessionAware接口,若实现了,就会调用UserAction的setSession()方法,并把session作为参数传入该方法,这样就实现了session的注入。
三、使用耦合方式访问Servlet API
ActionContext类没有包装所有的Servlet API,有些功能的实现还是需要原始是Servlet API才能实现,如获取客户端的响应,HttpServletResponse对象,不过strut2提供了ServletActionContext来获取原始是Servlet API.
public String login() { Map<String, Object> map = new HashMap<String, Object>(); boolean isLogin = (Boolean) map.get("isLogin"); if (isLogin) { /** * 耦合方式 */ ServletContext sc=ServletActionContext.getServletContext();//得到Servlet上下文 HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = request.getSession(); session.setAttribute("user", map.get("user")); return SUCCESS; } else { return INPUT; } }