一、web资源是什么?
web资源是HttpServletRequest、HttpSession、ServletContext等原生的Servlet API。
二、为什么要访问web资源?
B/S的应用的controller中必然需要访问web资源,比如:向域对象中读写属性、读写Cookie、获取realPath等...
三、怎么访问web资源?
访问web资源有两种方式:
和Servlet API解耦的方式:
只能访问到有限的servlet API对象,而且只能访问到有限的方法(读取请求参数、访问域对象的属性、使session失效等...)
(1)实现ActionContext
为了避免与servlet API耦合在一起,方便Action做单元测试。 ActionContext是Action执行的上下文对象。 在ActionContext中保存了Action执行所需要的所有对象。 包括parameters、request、session、application等。 获取HttpServletRequest对应的Map对象:
public Object get(Object key):ActionContext类中没有提供类似getRequest()这样的方法来获取HttpServletRequest对应的Map对象。要得到HttpServletRequest对应的Map对象,可以通过为get()方法传递“request”参数实现。
获取HttpSession对应的Map对象: public Map getSession();
获取ServletContext对应的Map对象: public Map getApplication();
获取请求参数对应的Map对象: public Map getParameters();
(2)实现XxxAware接口
Struts2提供了4种分别来访问ActionContext、Request、Response和Session对象的接口,
根据具体需要选择就可以了。4个接口如下:
org.apache.struts2.interceptor.ApplicationAware
org.apache.struts2.interceptor.SessionAware
org.apache.struts2.interceptor.RequestAware
org.apache.struts2.interceptor.ParameterAware
选用建议:若一个Action类中有多个action方法,且多个方法都需要使用域对象的Map或parameters,
则建议使用Aware接口的方式。因为只要定义成员变量就可以了(不用在每个方法里获取)。
和Servlet API耦合的方式:
可以访问更多的servlet API对象,且可以调用其原生的方法。 在动作类里,可以通过ServletActionContext对象或通过实现Aware接口去访问Web资源。 实现Aware接口是依赖注入技术的一种实现,这也是推荐的方法,因为它将使你的动作类更容易测试。
(1)实现ServletActionContext
ServletActionContext包括ActionContext,并且比ActionContext更容易使用。有以下方法:
public static javax.servlet.http.HttpServletRequest getRequest(),返回当前HttpServletRequest对象;
public static javax.servlet.http.HttpServletResponse getResponse(),返回当前HttpServletResponse对象;
public static javax.servlet.ServletContext getServletContext(),返回ServletContext对象;
可以通过在HttpServletRequest对象上调用一个getSession方法的办法来获得HttpSession对象。如果使用了basicStack或defaultStack拦截器栈,HttpSession对象将被自动创建。
注意:不应该从动作类的构造器里调用ServletActionContext类的方法.
因为在这个阶段,底层的ActionContext对象还没有被传递给它。
从某个动作的构造器里调用ServletActionContext.getServletContext方法将返回空值;
(2)实现ServletXxxAware接口
Struts2提供了4种分别来访问ServletContext、HttpServletRequest、HttpServletResponse和HttpSession对象的接口,根据具体选择即可。
4个接口如下:
org.apache.struts2.util.ServletContextAware;
org.apache.struts2.interceptor.ServletRequestAware;
org.apache.struts2.interceptor.ServletReponseAware;
org.apache.struts2.interceptor.SessionAware;