zoukankan      html  css  js  c++  java
  • Struts2中ActionContext和ServletActionContext

    转自:http://blog.sina.com.cn/s/blog_6c9bac050100y9iw.html

    Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话 (Session)的一些信息, 甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作。

    我们需要在Action中取得request请求参数"username"的值:

    ActionContext context = ActionContext.getContext();
    
    Map params = context.getParameters();
    
    String username = (String) params.get("username");

    ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象

    一般情况,我们的ActionContext都是通过:ActionContext context = (ActionContext) actionContext.get();来获取的.

    我们再来看看这里的actionContext对象的创建:

    static ThreadLocal actionContext = new ActionContextThreadLocal();

    ActionContextThreadLocal是实现ThreadLocal的一个内部类.ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本, 而不会和其它线程的副本冲突.这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的.

    下面我们看看怎么通过ActionContext取得我们的HttpSession:

    Map session = ActionContext.getContext().getSession();

    再看看怎么通过ServletActionContext取得我们的HttpSession:

    ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与JavaServlet相关对象访问的功能,它可以取得的对象有:

    1, javax.servlet.http.HttpServletRequest:HTTPservlet请求对象

    2, javax.servlet.http.HttpServletResponse;:HTTPservlet相应对象

    3, javax.servlet.ServletContext:Servlet 上下文信息

    4, javax.servlet.ServletConfig:Servlet配置对象

    5, javax.servlet.jsp.PageContext:Http页面上下文

    下面我们看看几个简单的例子,让我们了解如何从ServletActionContext里取得JavaServlet的相关对象:

    1, 取得HttpServletRequest对象:

    HttpServletRequest request = ServletActionContext. getRequest();

    2, 取得HttpSession对象:

    HttpSession session = ServletActionContext. getRequest().getSession();

    ServletActionContext 和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?

    我们遵循的原则是:

    (1)如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象.

    (2)在使用ActionContext时有一点要注意:不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null.

    如果我要取得Servlet API中的一些对象,如request,response或session等,应该怎么做?

    Strutx 2.0你可以有两种方式获得这些对象:IoC方式IoC(控制反转Inversion of Control)方式.

    A、非IoC方式

     要获得上述对象,关键Struts 2.0中com.opensymphony.xwork2.ActionContext类.我们可以通过它的静态方法getContext()获取当前 Action的上下文对象. 另外,org.apache.struts2.ServletActionContext作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象.

    HttpServletRequest request = ServletActionContext.getRequest();
    
    HttpServletResponse response = ServletActionContext.getResponse();
    
    HttpSession session = request.getSession();

    6 classes/tutorial/NonIoCServlet.java

     1 package tutorial;
     2 
     3 import javax.servlet.http.HttpServletRequest;
     4 
     5 import javax.servlet.http.HttpServletResponse;
     6 
     7 import javax.servlet.http.HttpSession;
     8 
     9 import org.apache.struts2.ServletActionContext;
    10 
    11 import com.opensymphony.xwork2.ActionContext;
    12 
    13 import com.opensymphony.xwork2.ActionSupport;
    14 
    15 Public class NonIoCServletextends ActionSupport {
    16 
    17   private String message;
    18 
    19  
    20 
    21   public String getMessage() {
    22 
    23     return message;
    24 
    25   }
    26 
    27   HttpServletRequest request = ServletActionContext.getRequest();
    28 
    29   HttpServletResponse response = ServletActionContext.getResponse();
    30 
    31   HttpSession session = request.getSession();
    32 
    33  
    34 
    35   @Override
    36 
    37   public String execute() {
    38 
    39     ActionContext.getContext().getSession().put("msg", "Hello World from Session!");[A2]  
    40 
    41  
    42 
    43     StringBuffer sb =new StringBuffer("Message from request: ");
    44 
    45     sb.append(request.getParameter("msg"));
    46 
    47  
    48 
    49     sb.append("<br>Response Buffer Size: ");
    50 
    51     sb.append(response.getBufferSize());
    52 
    53  
    54 
    55     sb.append("<br>Session ID: ");
    56 
    57     sb.append(session.getId());[A3]  
    58 
    59  
    60 
    61     message = sb.toString();  //转换为字符串。
    62 
    63     return SUCCESS;
    64 
    65   }
    66 
    67 }   //与LoginAction类似的方法。

    如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象.[A1]  

     

    BIoC方式

    要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点.具体实现,请参考例6 IocServlet.java.

    6 classes/tutorial/IoCServlet.java

     1 package tutorial;
     2 
     3 import java.util.Map;
     4 
     5 import javax.servlet.http.HttpServletRequest;
     6 
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 import javax.servlet.http.HttpSession;
    10 
    11 import org.apache.struts2.interceptor.ServletRequestAware;
    12 
    13 import org.apache.struts2.interceptor.ServletResponseAware;
    14 
    15 import org.apache.struts2.interceptor.SessionAware;
    16 
    17 import com.opensymphony.xwork2.ActionContext;
    18 
    19 import com.opensymphony.xwork2.ActionSupport;
    20 
    21 public class IoCServlet extends ActionSupport implements SessionAware,  ServletRequestAware, ServletResponseAware {
    22 
    23   private String message;
    24 
    25   private Map att;
    26 
    27   private HttpServletRequest request;
    28 
    29   private HttpServletResponse response;
    30 
    31  
    32 
    33   public String getMessage() {
    34 
    35     return message;
    36 
    37   }
    38 
    39   public void setSession(Map att) {
    40 
    41     this.att = att;
    42 
    43   }[A5]  
    44 
    45   publicvoid setServletRequest(HttpServletRequest request) {
    46 
    47     this.request = request;
    48 
    49   }
    50 
    51   publicvoid setServletResponse(HttpServletResponse response) {
    52 
    53     this.response = response;
    54 
    55   }[A5]  
    56 
    57  
    58 
    59   @Override
    60 
    61   public String execute() {
    62 
    63     att [A6]  .put("msg", "Hello World from Session!");
    64 
    65  
    66 
    67     HttpSession session = request.getSession();
    68 
    69  
    70 
    71     StringBuffer sb =new StringBuffer("Message from request: ");
    72 
    73     sb.append(request.getParameter("msg"));
    74 
    75     sb.append("<br>Response Buffer Size: ");
    76 
    77     sb.append(response.getBufferSize());
    78 
    79     sb.append("<br>Session ID: ");
    80 
    81     sb.append(session.getId());
    82 
    83  
    84 
    85     message = sb.toString();
    86   
    87     return SUCCESS;
    88 
    89   }
    90 
    91 }

    6 Servlet.jsp

    <%@ page contentType="text/html; charset=UTF-8" %>
    
    <%@ taglib prefix="s" uri="/struts-tags"%>
    
    <html>
    
      <head>
    
        <title>Hello World!</title>
    
      </head>
    
      <body>
    
        <h2>
    
          <s:property value="message" escape="false"/>
    
          <br>Message from session: <s:property value="#session.msg"/>
    
        </h2>
    
      </body>
    
    </html>

    6 classes/struts.xml中NonIocServlet和IoCServlet Action的配置

    <action name="NonIoCServlet" class="tutorial.NonIoCServlet">
    
      <result>/Servlet.jsp</result>
    
    </action>
    
    <action name="IoCServlet" class="tutorial.IoCServlet">
    
      <result>/Servlet.jsp</result>
    
    </action>

     运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts2_Action /NonIoCServlet.action?msg=Hello World! 或http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello World!

     在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出<br>转行,第二次的value中的OGNL为"#session.msg",它的作用与session.getAttribute("msg")等同.

     

     

    附:ActionContext的常用方法(来自Struts2.0  API)

    (一)get

    public Object get(Object key)

    Returns a value that is stored in the current ActionContext by doing a lookup using the value's key.

    Parameters:

    key- the key used to find the value.

    Returns:

    the value that was found using the key or null if the key was not found.

    Struts2中ActionContext介绍

     (二)put

    public void put(Object key, Object value)

    Stores a value in the current ActionContext. The value can be looked up using the key.

    Parameters:

    key- the key of the value.

    value- the value to be stored.

     

    Struts2中ActionContext介绍

    (三)getContext

    public static ActionContext getContext()

    Returns the ActionContext specific to the current thread.

    Returns:

    the ActionContext for the current thread, is never null.

    Struts2中ActionContext介绍

    (四)getSession

    public Map getSession()

    Gets the Map of HttpSession values when in a servlet environment or a generic session map otherwise.

    Returns:

    the Map of HttpSession values when in a servlet environment or a generic session map otherwise.

    Struts2中ActionContext介绍

     ()setSession

    public void setSession(Map session)

    Sets a map of action session values.

    Parameters:

    session- the session values.

     

     

    Struts2action类继承

    com.opensymphony.xwork2.ActionSupport类的常用方法

     

    addFieldError  //该方法主要用于验证的方法之中

    public void addFieldError(String fieldName,  String errorMessage)

    Description copied from interface: ValidationAware

    Add an error message for a given field.

    Specified by:

    addFieldErrorin interface ValidationAware

    Parameters:

    fieldName- name of field

    errorMessage- the error message

    Struts2中ActionContext介绍

    validate[A7]  

    public void validate()

    A default implementation that validates nothing. Subclasses should override this method to provide validations.

    Specified by:

    validatein interface Validateable


    这一点比较的重要,例如:ActionContext.getContext().getSession().put("user""value");

    与右上角的是一个模式。

    Java语法基础,使用stringBuffer。

    对属性(实例)设置setter方法。

    方法的来源,见后面补充的常用方法:

    public void setSession(Map session)

    Sets a map of action session values. 设置session值,

    Parameters:

    session- the session values.

     

    为当前的session,所以可以调用put方法。详细信息见补充的知识。

    常用于校验登陆程序的账号和密码是否为空,可以加入addFieldError方法。例如public void validate() {

           if (null == login.getUserID() || "".equals(login.getUserID())) {         this.addFieldError("login.userID""学号不能为空");       }

           if (null == login.getUserPassword()              ||"".equals(login.getUserPassword())) {         this.addFieldError("login.userPassword""密码不能为空");    }

        }

  • 相关阅读:
    solr6.5搭建以及使用经验
    Intellij IDEA svn的使用记录
    初次从eclipse转到intellij idea上的一些经验
    Linux一键安装PHP/JAVA环境OneinStack
    CentOS下yum安装mysql,jdk以及tomcat
    centos yum换阿里云源
    ehcache配置:使用Spring+SpringMVC+Mybatis或者有shiro
    微博短链接的生成算法(Java版本)
    手把手教你使用Git
    工作中有关分布式缓存的使用和需要注意的问题梳理
  • 原文地址:https://www.cnblogs.com/x_wukong/p/3887737.html
Copyright © 2011-2022 走看看