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

来源:互联网 发布:失业金数据与非农数据 编辑:程序博客网 时间:2024/06/06 02:05

访问Servlet资源

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

  1. 通过使用org.apache.struts2.ServletActionContext类
  2. 通过实现*Aware接口

ServletActionContext类

类图

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;@Overridepublic 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. 典型的使用可能是缓存用户数据,如姓名、或一个购物车。

以上。。。

0 0
原创粉丝点击