struts2学习之访问Servlet对象的两种实现方式

访问Servlet资源

由于struts2采用的是低侵入式设计,那么在struts.xml的动作类里要访问serlvet的相关资源可以通过以下2种方式:

  1. 通过使用org.apache.struts2.ServletActionContext类
  2. 通过实现*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个分别用来访问ServletContextHttpServletRequestHttpServletResponseHttpSession对象的接口,只要根据自己的具体需要有选择地实现它们就可以了,这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);
}

说明:

  1. SessionAware接口与以上3个接口有些小区别。实现该接口并不能将当前的HttpSession对象提供给你,你得到的将是一个java.util.Map类型的http session对象。
  2. Action类想要访问用户的HTTP session对象必须实现该接口。
  3. 这将给Action类访问一个MAP,Action类可以put一个可供后续请求访问的对象。
  4. 典型的使用可能是缓存用户数据,如姓名、或一个购物车。

以上。。。

你可能感兴趣的:(servlet)