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

  • 相关阅读:
    docker进入容器命令
    docker复制文件到容器内以及从容器内复制文件到宿主机
    在idea中创建maven父子工程,子工程无法导入父工程依赖的问题
    maven merge 其他分支比如master的方法
    Maven 右边的maven 项目为空 pom文件
    Spark Streaming集成Kafka调优
    spark sql/hive小文件问题
    CompletableFuture详解
    样式绑定styleBinding
    jsonArray图片数组实例
  • 原文地址:https://www.cnblogs.com/tech-bird/p/4148462.html
Copyright © 2011-2022 走看看