*** 完全解耦合的方式
*** 使用ServletActionContext中静态方法直接访问Servlet的API
*** 使用接口注入的方式 一、完全解耦合的方式 如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API。 一些常用的方法如下: //private ActionContext context ;//该方法还可以取得值栈(getValueStack()),使用push(obj)往值栈中放数据 private Map request; private Map session ; private Map application ; public LoginAction1(){ request = (Map)ActionContext.getContext().get("request"); //获取request session = ActionContext.getContext().getSession(); //取得session application = ActionContext.getContext().getApplication(); //取得application request.put("r1","r1"); session.put("i1","i1"); application.put("a1","a1"); return SUCCESS; } 二、使用ServletActionContext中静态方法直接访问Servlet的API Struts2中提供了一个静态类,它里面的方法可以获取到我们的HttpServletResponse, HttpServletRequest。 ServletActionContext具体的方法如下 * getPageContext(); * getRequest() * getResponse(); * getServletContext(); //也就是application对象 注意这里没有getSession(),我们可以通过request对象获取session对象 private HttpServletRequest request; private HttpSession session; private ServletContext application; public LoginAction(){ request = ServletActionContext.getRequest(); //获取request对象 session = request.getSession(); //由request获取session application = session.getServletContext(); //由session获取application } 三、使用接口注入的方式 虽然Struts2提供了ActionContext来访问Servlet API,但是这种方式毕竟不能直接获取Servelt API实例,为了在Action中直接访问Servlet API,Struts2还提供了一系列接口。 ServletContextAware 实现此接口后,可以取得ServletContext ServletRequestAware 实现此接口后,可以取得HttpServletRequest ServletResponseAware 实现此接口后,可以取得HttpServletResponse SessionAware 实现此接口后,可以取得HttpSession,注意,这里有点特殊,取得的是一个Map<String,Object> session,拦截器负责将session中存储的键值进行解析,并一一对应. 所以我们通常的做法是: public class BaseAction implements ServletResponseAware, ServletRequestAware, SessionAware { protected HttpServletResponse response; protected HttpServletRequest request; protected Map<String, Object> session; //省略了get和set方法 //下面就可以直接使用上面 response,request和session } } 了让BaseAction能有验证的功能,并且不能被实例化,开发中我们会这样做: public abstract class BaseAction extends ActionSupport implements ServletResponseAware, ServletRequestAware, SessionAware 然后让我们每个模块的Action来继承这个BaseAction类,然后我们就可以在Action中直接使用Servelt的API了。