访问Servlet资源
由于struts2采用的是低侵入式设计,那么在struts.xml的动作类里要访问serlvet的相关资源可以通过以下2种方式:
- 通过使用org.apache.struts2.ServletActionContext类
- 通过实现*Aware接口
ServletActionContext类
类图
由类图可知,其中定义的方法均为静态的,因此我们可以很方便地去获取到与Servlet有关的资源。
eg:
//返回当前ActionContext对象
ServletActionContext.getActionContext(HttpServletRequest req)
//返回当前request域的值栈对象
ServletActionContext.getValueStack(HttpServletRequest req)
//获取此上下文的动作映射
ServletActionContext.getActionMapping()
//返回HTTP page域对象
ServletActionContext.getPageContext()
//返回HttpServletRequest对象
ServletActionContext.getRequest()
//返回HttpServletResponse对象
ServletActionContext.getResponse()
//返回servlet上下文
ServletActionContext.getServletContext()
功能
这类是ActionContext的子类,提供访问动作名称(action name),值栈(ValueStack)之类的东西。
这类添加访问Web对象,如Servlet的参数,request属性和HTTP session之类的东西。
Aware接口
struts2提供了4个分别用来访问ServletContext、HttpServletRequest、HttpServletResponse和HttpSession对象的接口,只要根据自己的具体需要有选择地实现它们就可以了,这4个接口分别是:
- org.apache.struts2.util.ServletContextAware
- org.apache.struts2.interceptor.ServletRequestAware
- org.apache.struts2.interceptor.ServletResponseAware
- org.apache.struts2.interceptor.SessionAware
ServletContextAware接口
如果要从动作类内部访问ServletContext对象,可以实现该接口,它的定义如下:
/**
* For components that have a dependence on the Servlet context.
*/
public interface ServletContextAware {
public void setServletContext(ServletContext context);
}
在调用一个动作类时,struts将检查相关的动作类是否实现了该接口。如果是,struts将在填充动作属性之前,先调用该动作的setServletContext方法,并传递ServletContext对象后,再执行动作方法。在setServletContext方法内,你需要把ServletContext对象赋给一个当前ServletContext对象,如:
private ServletContext servletContext;
@Override
public void setServletContext(ServletContext context) {
this.servletContext = context;
}
ServletRequestAware接口
如果要从动作类内部访问HttpServletRequest对象,可以实现该接口,它的定义如下:
public interface ServletRequestAware {
/**
* Sets the HTTP request object in implementing classes.
*
* @param request the HTTP request.
*/
public void setServletRequest(HttpServletRequest request);
}
说明:
所有Action类要访问servlet request对象必须实现该接口。
如果动作类是在servlet中使用,这个接口是唯一相关的环境。
注意,使用此接口会使Action捆绑到一个servlet环境,因此,如果可能的话应该避免像单元测试的事将会变得更加困难。
ServletResponseAware接口
如果要从动作类内部访问HttpServletResponse对象,可以实现该接口,它的定义如下:
public interface ServletResponseAware {
/**
* Sets the HTTP response object in implementing classes.
*
* @param response the HTTP response.
*/
public void setServletResponse(HttpServletResponse response);
}
说明:
所有Action类要访问servlet response对象必须实现该接口。
如果动作类是在servlet中使用,这个接口是唯一相关的环境。
注意,使用此接口会使Action捆绑到一个servlet环境,因此,如果可能的话应该避免像单元测试的事将会变得更加困难。
SessionAware接口
该接口定义如下:
public interface SessionAware {
/**
* Sets the Map of session attributes in the implementing class.
*
* @param session a Map of HTTP session attribute name/value pairs.
*/
public void setSession(Map<String,Object> session);
}
说明:
- SessionAware接口与以上3个接口有些小区别。实现该接口并不能将当前的HttpSession对象提供给你,你得到的将是一个java.util.Map类型的http session对象。
- Action类想要访问用户的HTTP session对象必须实现该接口。
- 这将给Action类访问一个MAP,Action类可以put一个可供后续请求访问的对象。
- 典型的使用可能是缓存用户数据,如姓名、或一个购物车。
以上。。。