zoukankan      html  css  js  c++  java
  • ActionContext介绍(在Struts2中)

    一种属性的有序序列,它们为驻留在环境内的对象定义环境。在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步、事务、实时激活、安全性等等。多个对象可以存留在一个上下文内。也有根据上下文理解意思的意思。

    ActionContext介绍(在Struts2中)

    在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(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中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象.在使用ActionContext时有一点要注意:不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null.

    如果我要取得Servlet API中的一些对象,如request,response或session等,应该怎么做?在Strutx 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式.

    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();

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

    B、IoC方式

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

    例6 classes/tutorial/NonIoCServlet.java

    package tutorial;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import javax.servlet.http.HttpSession;

    import org.apache.struts2.ServletActionContext;

    import com.opensymphony.xwork2.ActionContext;

    import com.opensymphony.xwork2.ActionSupport;

    Public class NonIoCServlet extends ActionSupport {

    private String message;

    public String getMessage() {

    return message;

    }

    HttpServletRequest request = ServletActionContext.getRequest();

    HttpServletResponse response = ServletActionContext.getResponse();

    HttpSession session = request.getSession();

    @Override

    public String execute() {

    ActionContext.getContext().getSession().put("msg", "Hello World from Session!");[A2] 

    StringBuffer sb =new StringBuffer("Message from request: ");

    sb.append(request.getParameter("msg"));

    sb.append("<br>Response Buffer Size: ");

    sb.append(response.getBufferSize());

    sb.append("<br>Session ID: ");

    sb.append(session.getId());

    message = sb.toString();  //转换为字符串。

    return SUCCESS;

    }

      //与LoginAction类似的方法。

    例6 classes/tutorial/IoCServlet.java

    package tutorial;

    import java.util.Map;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import javax.servlet.http.HttpSession;

    import org.apache.struts2.interceptor.ServletRequestAware;

    import org.apache.struts2.interceptor.ServletResponseAware;

    import org.apache.struts2.interceptor.SessionAware;

    import com.opensymphony.xwork2.ActionContext;

    import com.opensymphony.xwork2.ActionSupport;

    publicclass IoCServlet extends ActionSupport implements SessionAware,   ServletRequestAware, ServletResponseAware {

    private String message;

    private Map att;

    private HttpServletRequest request;

    private HttpServletResponse response;

    public String getMessage() {

    return message;

    }

    public void setSession(Map att) {

    this.att = att;

    }

    publicvoid setServletRequest(HttpServletRequest request) {

    this.request = request;

    }

    publicvoid setServletResponse(HttpServletResponse response) {

    this.response = response;

    }

    @Override

    public String execute() {

    att.put("msg", "Hello World from Session!");

    HttpSession session = request.getSession();

    StringBuffer sb =new StringBuffer("Message from request: ");

    sb.append(request.getParameter("msg"));

    sb.append("<br>Response Buffer Size: ");

    sb.append(response.getBufferSize());

    sb.append("<br>Session ID: ");

    sb.append(session.getId());

    message = sb.toString();

    return SUCCESS;

    }

    }

    例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%20World! 或http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20World!

     在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.

     (二)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.

    (三)getContext

    public static ActionContext getContext()

    Returns the ActionContext specific to the current thread.

    Returns:

    the ActionContext for the current thread, is never null.

    (四)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.

     ()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

    validate

    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", "密码不能为空");    }

        }

  • 相关阅读:
    flex + bison multiple parsers
    Educational Codeforces Round 95 (Rated for Div. 2)
    python学习笔记 day20 序列化模块(二)
    python学习笔记 day20 常用模块(六)
    python 学习笔记 常用模块(五)
    python学习笔记 day19 常用模块(四)
    python学习笔记 day19 常用模块(三)
    python学习笔记 day19 常用模块(二)
    python学习笔记 day19 作业讲解-使用正则表达式实现计算器
    python学习笔记 day19 常用模块
  • 原文地址:https://www.cnblogs.com/snowbook/p/5360564.html
Copyright © 2011-2022 走看看