zoukankan      html  css  js  c++  java
  • valuestack(值栈) 和 actioncontext(上下文)

            Strut2的Action类通过属性可以获得所有相关的值,如请求参数属性值等。要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性。在Struts2调用Action类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。要完成这个功能,有很大程度上,Struts2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期,每个Action类的对象实例会拥有一个ValueStack对象。

           当Struts2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。只是所有的属性值都是默认的值,如String类型的属性值为null,int类型的属性值为0等。在处理完上述工作后,Struts 2就会调用拦截器链中的拦截器,这些拦截器会根据用户请求参数值去更新ValueStack对象顶层节点的相应属性的值,最后会传到Action对象,并将ValueStack对象中的属性值,赋给Action类的相应属性。当调用完所有的拦截器后,才会调用Action类的Action方法。ValueStack会在请求开始时被创建,请求结束时消亡。

             也就是说valuestack 是与Action类一一对应的

    举个栗子:

    一个重定向的过程

    把第一个视图带的的数据传递到第二个视图

    第一个视图传递到服务器 : 通过参数

    服务器传递到第二个视图:  通过valuestack(值栈)?   

    index.jsp视图

    <body>
        向结果传参数
        <ol>
           <li><a href="user/user?type=1">传参数</a></li>
        </ol>    
    </body>

     struct:

    当struct接收到请求之后,会创建一个UserAction 的Action实例对象,然后相应的属性放到栈中。

    通过$符号取出来

    并且是一个重定向,也就是说客户端再次发出请求

    请求地址是 ..../user_success.jsp?t=1

    <struts>
        <constant name="struts.devMode" value="true" />
        <package name="user" namespace="/user" extends="struts-default">
            
            <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
                <result type="redirect">/user_success.jsp?t=${type}</result>
            </action>        
        </package>
            
    </struts>

     这是Action

    有一个type属性

    public class UserAction extends ActionSupport {
        private int type;
        
        public int getType() {
            return type;
        }
    
        public void setType(int type) {
            this.type = type;
        }
    
        @Override
        public String execute() throws Exception {
            return "success";
        }
    
    }

     因为这次请求是请求一个JSP,根本就没有Action,所以值栈为空,而下面

         <s:property value="t"/><br/>

     这种方式是从值栈中取值,肯定是空的。

    那么怎么才能取出这个值呢?

    通过actioncontext来取。

    <?xml version="1.0" encoding="GB18030" ?>
    <%@ page language="java" contentType="text/html; charset=GB18030"
        pageEncoding="GB18030"%>
        <%@taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
    <title>UserSuccess</title>
    </head>
    <body>
        User Success!
        from valuestack:      <s:property value="t"/><br/>
        from actioncontext:   <s:property value="#parameters.t"/>
        <s:debug></s:debug>
    </body>
    </html>

     结果页面:

     点击debug

  • 相关阅读:
    实例属性 类属性 实例域 类域
    研究数据集
    static 静态域 类域 静态方法 工厂方法 he use of the static keyword to create fields and methods that belong to the class, rather than to an instance of the class 非访问修饰符
    accessor mothod mutator mothod 更改器方法 访问器方法 类的方法可以访问类的任何一个对象的私有域!
    上钻 下钻 切片 转轴 降采样
    识别会话
    Performance Tuning Using Linux Process Management Commands
    Secure Hash Algorithm 3
    grouped differently across partitions
    spark 划分stage Wide vs Narrow Dependencies 窄依赖 宽依赖 解析 作业 job stage 阶段 RDD有向无环图拆分 任务 Task 网络传输和计算开销 任务集 taskset
  • 原文地址:https://www.cnblogs.com/tech-bird/p/4148462.html
Copyright © 2011-2022 走看看