总记:web应用中通常需要访问的servlet API就是HttpServletRequest、httpSession和ServletContext,
这三个接口分别代表JSP内置对象中的request、session和application。
在Strutx 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式
一、非IOC方式
使用的原则:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,
让我们的Action尽量不要直接去访问Servlet的相关对象
1.Struts2提供了一个ActionContext类,Struts2的Action可以通过该类来访问Servlet API(推荐使用该方法)(非IOC方式)
ActionContext类中包含的几个常用的方法:
①Object get(Object key):该方法类似于调用HttpServletRequest的getAttribute(String name)方法
②Map getApplication(): 返回一个Map对象,该对象模拟了该应用的ServletContext实例
③static ActionContext getContext():静态方法,获取系统的ActionContext实例
④Map getParameters():获得所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap()方法
⑤Map getSession();返回一个Map对象,该Map对象模拟了HttpSession实例
⑥void setApplication(Map application):直接传入一个Map实例。将该Map实例里的key-value对转换成application的属性名,属性值。
⑦void setSession(Map session):直接传入一个Map实例,将该Map实例里的key-value转换成session的属性名、属性值。
相关用法小实例:
public String execute() throws Exception{ ActionContext ctx = ActionContext.getContext(); //通过ActionContext访问application范围的属性值 Integer counter = (Integer)ctx.getApplication().get("counter"); //通过ActionContext设置session范围的属性 ctx.getApplication().put("counter", counter); //通过ActionContext设置session范围的属性 ctx.getSession().put("User", getUsername); //获取request Map request=(Map)ActionContext.getContext().get("request"); //把想存的值存入request域中 request.put("requestName", name); }
2. 使用ServletActionContext访问Servlet API
ServletActionContext工具类包含如下的几个静态方法:
static PageContext getPageContext(); 取得web应用的PageContext对象
static HttpServletRequest getRequest(); 取得web应用的HttpServletRequest对象
static HttpServletResponse getResponse(); 取得web应用的HttpServletResponse对象
static ServletContext getServletContext(); 取得web应用的ServletContext对象
二 IOC(控制反转Inversion of Control)
为了在Action中直接访问Servlet API,Struts2还提供了如下几个接口。
ServletContextAware:实现该接口的Action可以直接访问Web应用的ServletContext实例
ServletRequestAware:实现该接口的Action可以直接访问用户请求的HttpServletRequest实例
ServletResponseAware:实现该接口的Action可以直接访问服务器响应的HttpServletResponse实例
public class SampleAction implementsAction, RequestAware, SessionAware, ApplicationAware { private Map request; private Map session; private Map application; @Override public void setRequest(Map request) {this.request = request;} @Override public void setSession(Map session) {this.session = session;} @Override public void setApplication(Map application) {this.application = application;} }