struts2的值栈(重点) 值栈是一个存储数据的内存结构 本质是一个接口 它的实现类OgnlValueStack

值栈(重要)和ognl表达式 (值栈其实是一个接口 它的实现类是OgnlValueStack)

1、  只要是一个mvc框架,必须解决数据的存和取的问题

2、  Struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构

3、  把数据存在值栈中,在页面上利用ognl表达式显示出来

 

值栈的内存结构

获取值栈的路径

  //获取值栈的三种方法
        ValueStack v1 = ActionContext.getContext().getValueStack();
        ValueStack v2 = ServletActionContext.getValueStack(ServletActionContext.getRequest());
        ValueStack v3 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");

三种方式获取的值栈都是同一个对象

       说明:

1、  因为有一种是从request域中获取的,所以生命周期就是一次request请求

 

内存结构:

  值栈有两个内存结构:

    一个是Map(map栈 在这里存放了request,response,session,application等servlet容器的内容) 

        一个是ArrayList结构(root  对象栈)

 

 

 

1、  大致图:

 

 

说明:

     从上图中可以看出valueStack总共分为两个部分:

          对象栈:root (arraylist结构)

          Map栈:_values       在这里存放了request,response,session,application等servlet容器的内容

 

 

 

对象栈(  root   arrylist结构)的存储操作

public class ValueStackAction extends ActionSupport {

    public String testGetValueStake(){

        //说明值栈是从request中获取到的 所以 值栈的生命周期就是一次 request请求
        ValueStack v1 = ActionContext.getContext().getValueStack();
        Person p = new Person();
        p.setName("hello");

        //方式1
        //push可以直接放入到栈顶!
        v1.push(p);//将对象放入栈顶
        //获取对象的值栈
        Object peek = v1.peek();
        System.out.println(peek.toString()); //Person{name='hello'}

        //方式2
        //add就必须先getRoot()
        v1.getRoot().add(p);
        Object o = v1.getRoot().get(0);
        System.out.println(o.toString()); //Person{name='hello'}



        //删除值栈对象
        v1.getRoot().remove(0); //方式1
        v1.pop(); //方式2


        return null;
    }

}

 

Map栈(  _Values  map结构)的存储操作

_values       在这里存放了request,response,session,application等servlet容器的内容 取和删除都和request等一致

 

posted @ 2020-05-28 17:36  gaoshengjun  阅读(134)  评论(0编辑  收藏  举报