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

        }

  • 相关阅读:
    常用命令收集
    wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)
    Wireshark找不到网络接口问题
    带卡扣的网卡接口使用小Tips,大家注意插拔网线的手法啊!
    HOW TO BE SINGLE 最后那段的摘录
    github常见操作和常见错误!错误提示:fatal: remote origin already exists.
    关于工伤事故索赔计算很好用的一款APP
    MySQL文件目录格式及存放位置
    如何取消win10电脑自动更新
    推荐!手把手教你使用Git
  • 原文地址:https://www.cnblogs.com/snowbook/p/5360564.html
Copyright © 2011-2022 走看看