Struts2 中访问 Request、Session 和 Application



Struts2 中访问 Request、Session 和 Application。经常需要在 Action 中传入一些参数到 JSP 页面,可以用 来获取参数,但是这些参数都仅限于特定的数据,如果我们想要像 JSP 中使用 request、Session 和 application ,我们怎么办呢?

一、

我们可以通过 ActionContext 对象得到 Request 等的 Map 类型对象进行赋值和参数的传递,代码参考如下:

   1:  public String execute(){
   2:
   3:      ((Map)ActionContext.getContext().get("request")).put("r1", "r1");//Request 的 Map 对象
   4:      ActionContext.getContext().getSession().put("s1", "s1");// Session 的 Map 对象
   5:      ActionContext.getContext().getApplication().put("a1", "a1");//Application 的 Map 对象
   6:      return SUCCESS;
   7:  }

通过上面这种方式定义 Action 就可以传递参数了,对此,我们在前台 JSP 页面获取参数的方法有两种:

一种是通过 标签来访问参数:

   1:
   2:
   3:

这种访问方式和在 value 的参数前面加了一个 # ,因为这些都是 Stack Context 里面的 key。

另一种访问参数的方法是我们熟悉的:

   1:  <%=request.getAttribute("r1") %>
   2:  <%=session.getAttribute("s1") %>
   3:  <%=application.getAttribute("a1") %>

或许有些不能理解,Map 型的 Request、Session、Application 可以这样访问?!是的,Struts2 做到了,应该是在内部做了一些转化的,将 Map 转型为 HttpServletRequest、HttpSession 和 ServletContext 。

这种方式是依赖 Struts2 环境的,因为使用了 ActionContext 类。

 

二、

这种方法是通过依赖注入( DI, Dependency Injection ),或者叫控制反转 ( IoC, Inverse of Control ) 实现的。这种方式最常用。

原理是定义 Action 实现 RequestAware、SessionAware、ApplicationAware 接口,实现里面定义的 setXxxxx( Map<string,object> xxx ) 方法,之后等待 Struts2 Context 给我们定义的 Action 注入 request、 session 、 application 等等。(控制反转的理解可以认为本来 request、session、application 这些变量是由 Action 自己控制的,实现这些 Aware 接口后控制权就移交给 Struts2 Context 了)

Action 代码如下,其他代码如上所示:

   1:  package com.cdp.struts2;
   2:
   3:  import java.util.Map;
   4:
   5:  import org.apache.struts2.interceptor.ApplicationAware;
   6:  import org.apache.struts2.interceptor.RequestAware;
   7:  import org.apache.struts2.interceptor.SessionAware;
   8:
   9:  import com.opensymphony.xwork2.ActionSupport;
  10:
  11:  public class Action2 extends ActionSupport implements RequestAware,
  12:          SessionAware, ApplicationAware {
  13:
  14:      private Map<string, Object=""> request;
  15:      private Map<string, Object=""> session;
  16:      private Map<string, Object=""> application;
  17:
  18:      public String execute() {
  19:
  20:          request.put("r1", "r1");
  21:          session.put("s1", "s1");
  22:          application.put("a1", "a1");
  23:          return SUCCESS;
  24:      }
  25:
  26:      public void setRequest(Map<string, Object=""> request) {
  27:          this.request = request;
  28:
  29:      }
  30:
  31:      public void setSession(Map<string, Object=""> session) {
  32:          this.session = session;
  33:
  34:      }
  35:
  36:      public void setApplication(Map<string, Object=""> application) {
  37:          this.application = application;
  38:
  39:      }
  40:


  41:  }

需要注意的是,这种方式是最常用的。

三、

第三种方式是直接创建真实的而非 Map 类型的 request 、 session 、 application 对象,方法如下:

   1:  package com.cdp.struts2;
   2:
   3:  import javax.faces.application.Application;
   4:  import javax.servlet.ServletContext;
   5:  import javax.servlet.http.HttpServletRequest;
   6:  import javax.servlet.http.HttpSession;
   7:
   8:  import org.apache.struts2.ServletActionContext;
   9:
  10:  import com.opensymphony.xwork2.ActionSupport;
  11:
  12:  public class Action3 extends ActionSupport{
  13:
  14:      private HttpServletRequest request;
  15:      private HttpSession session;
  16:      private ServletContext application;
  17:
  18:      public String execute(){
  19:          request=ServletActionContext.getRequest();
  20:          session=request.getSession();
  21:          application=session.getServletContext();
  22:          request.setAttribute("r1", "r1");
  23:          session.setAttribute("s1", "s1");
  24:          application.setAttribute("a1", "a1");
  25:          return SUCCESS;
  26:      }
  27:
  28:  }

四、

最后一种也是依赖注入实现的,Action 实现的是 ServletRequestAware 接口,让后通过 request 得到 session,通过 session 得到 application:

   1:  package com.cdp.struts2;
   2:
   3:  import javax.faces.application.Application;
   4:  import javax.servlet.ServletContext;
   5:  import javax.servlet.http.HttpServletRequest;
   6:  import javax.servlet.http.HttpSession;
   7:
   8:  import org.apache.struts2.ServletActionContext;
   9:  import org.apache.struts2.interceptor.ServletRequestAware;
  10:
  11:  import com.opensymphony.xwork2.ActionSupport;
  12:
  13:  public class Action4 extends ActionSupport implements ServletRequestAware{
  14:
  15:      private HttpServletRequest request;
  16:      private HttpSession session;
  17:      private ServletContext application;
  18:
  19:      public String execute(){
  20:          request.setAttribute("r1", "r1");
  21:          session.setAttribute("s1", "s1");
  22:          application.setAttribute("a1", "a1");
  23:          return SUCCESS;
  24:      }
  25:
  26:      public void setServletRequest(HttpServletRequest request) {
  27:          this.request=request;
  28:          this.session=request.getSession();
  29:          this.application=session.getServletContext();
  30:      }
  31:
  32:  }