zoukankan      html  css  js  c++  java
  • Struts2中的值栈

    一 什么是值栈

    值栈: struts2中提供的一种类似于域对象的工具, 用于struts2中的存值和取值.

      每次访问Action的时候, 都会创建一个action对象, 而每个action对象中都存在一个值栈对象

      值栈对象的声明周期与Action的生命周期(第一次访问action的时候被创建, 当action中方法返回值时被销毁)一致.

    二 Action中值栈对象的获取方法

      每个action只对应一个值栈对象. 值栈对象可以通过ActionContext对象中的方法获取.

      ActionContext context = ActionContext.getContext();
          ValueStack valueStack = context.getValueStack();

    三 值栈的结构

      值栈内部主要由两部分构成: root和context;

      root --> compoundroot extends ArrayList --> root是由list集合构成的

      context --> ognlcontext implements Map --> context是由map集合构成的

    可以通过ognl表达式中的<s:debug>标签查看值栈的内部结构

      在值栈中, 操作的数据一般是root数据(默认的在action中没有任何操作时, root栈顶元素就是action的引用). 而context中主要存放的是一些对象的引用.

      OgnlContext的主要结构为:request, session, application, parameters, attr, 他们对应的值分别是:request对象的引用, HttpSession的引用, ServletContext对象的引用, 请求参数(action后面的请求参数), 获取域对象.

    四 值栈中存放数据

    4.1 通过值栈对象中的set方法

      //1.通过值栈中的set方法,往值栈的root中存值
            ActionContext context = ActionContext.getContext();
            ValueStack stack = context.getValueStack();
            stack.set("key", "value");

      

    4.2 通过值栈对象中的put方法存值

      //2.通过值栈中的push方法,往栈顶添加值
            stack.push("TopstackElement");

      

    4.3 在action中定义成员变量并生成相应的set方法

    1> 值栈中存放基本数据类型

    package com.rodge.stack;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.util.ValueStack;

    public class SaveValueStack extends ActionSupport {
        //设置序列化版本号
        private static final long serialVersionUID = 1L;
        private String username = "";
        public String getUsername() {
            return username;
        }
        @Override
        public String execute() throws Exception {     
            //3.通过成员变量+get方法,设置值栈中的值,不用单独分配内存空间
            username = "stackValue";
            return "save";
        }
    }


    2> 值栈中存放对象

    package com.rodge.stack;
    import com.opensymphony.xwork2.ActionSupport;
    public class SaveObjectInStack extends ActionSupport {
        private static final long serialVersionUID = 1L;
        private User user = new User();
        public User getUser() {
            return user;
        }
        @Override
        public String execute() throws Exception {
            user.setUsername("小新");
            user.setAddress("Japen");
            user.setDesc("6毛");
            return "save";
        }  
    }


    3> 将集合存放在值栈中

    package com.rodge.stack;
    import java.util.ArrayList;
    import java.util.List;
    import com.opensymphony.xwork2.ActionSupport;
    public class ListStackAction extends ActionSupport {
     static final long serialVersionUID = 1L;
        private List<User> list = new ArrayList<User>();
        public List<User> getList() {
            return list;
        }
        @Override
        public String execute() throws Exception {
            User user1 = new User();
            user1.setUsername("小明");
            user1.setAddress("北京");
            user1.setDesc("教师外面");


            User user2 = new User();
            user2.setUsername("小王");
            user2.setAddress("隔壁");
            user2.setDesc("小王叔叔");


            list.add(user1);
            list.add(user2);
            return "list";
        }
    }

    五 在jsp页面中获取值栈数据

      使用struts2标签和ognl表达式获取值栈数据

      <%@ taglib uri="/struts-tags" prefix="s" %>

    5.1 获取值栈中的字符串数据

    <s:property value="username" />

    5.2 获取值栈中存放的对象数据

      <s:property value="user.username" />
        <s:property value="user.address" />
        <s:property value="user.desc" />

    5.3 获取值栈中存放的list集合

        <!-- 第一种获取list集合的方法 -->
        <s:property value="list[0].username" />
        <s:property value="list[0].address" />
        <s:property value="list[0].desc" />
        <hr/>
        <!-- 第二种获取list集合中数据的方法 -->
        <s:iterator value="list">
            <s:property value="username" />
            ----
            <s:property value="address" />
            ----
            <s:property value="desc" />
            <br/>
        </s:iterator>
        <hr/>

        <!-- 第三种获取list集合中数据的方法 -->
        <s:iterator value="list" var="user">
            <s:property value="#user.username" />
            --------
            <s:property value="#user.address" />
            --------
            <s:property value="#user.desc" />
            <br/>
        </s:iterator>

    5.4 值栈中获取其他数据

    1> 获取始终值栈对象的set方法存放在值栈中的数据stack.set("key", "value");
    <s:property value="key" />

    2>使用值栈对象里面的push方法把数据放到值栈里面

    <!-- 获取push方法存放到值栈中的数据 -->
        获取push方法存放到值栈中的数据:
        <s:property value="[0].top" />

    3> 位什么EL表达式可以获取值栈中的数据

      EL表达式并不是直接获取值栈中的数据. 是因为struts2中增强了reqeust总的getAttribute方法, 增强的getAttribute方法首先会在request域中寻找是否有值, 如果request域中有, 则直接返回; 如果域对象里面如果没有值,得到值栈对象,从值栈对象里面把值获取到,最后放到域对象里面.

    六 Ognl中#和%的使用

    1  #: 获取context里面的数据

     

    2  %:  的使用

    (1)使用struts2的表单标签,显示值,使用ognl表达式

     

    写ognl作为字符串显示出来,没有作为ognl表达式执行

    (2)使用%让表单标签里面值作为ognl执行

     

  • 相关阅读:
    secureCRT常用设置
    SecureCRT恢复默认字体
    hdu 1515 dfs
    hdu 2216 bfs
    hdu 1973 bfs+素数判断
    hdu 1429 bfs+状压
    poj 3463 次短路
    hdu 2962 最短路+二分
    hdu 2112 最短路
    hdu 3397 线段树
  • 原文地址:https://www.cnblogs.com/rodge-run/p/6441811.html
Copyright © 2011-2022 走看看