先说说值栈的存储结构,在值栈内部有两部分构成,一个成为Root的 List集合,另一个是成为Context的Map集合,这里的Context其实就是之前讲的ActionContext,之前的ActionContext讲解中说到它就是一个Map,看下图:
下面是之前讲解ActionContext中的图:
有没有感觉ActionContext和ValueStack中Context很像,没错,他们指的就是同一个东西,所以这里的Context的作用就是ActionContext,具体详解请看之前的文章 Struts2之ActionContext讲解
这里就主要讲解一下Root
上面说root是一个List,而且是一个ArrayList,从源码中可以看到
既然知道root是一个List集合,那么它的作用是什么呢?
在没有任何的代码操作下,里面只存储了一个:当前要访问的Action
值栈存值
ValueStack valueStack = ActionContext.getContext().getValueStack();
在上面代码中是通过ActionContext获得值栈,也就是说ActionContext这个Map中也保存了ValueStack这个对象的引用。
在上面图中讲到,ValueStack中有root和ActionContext
图中就看到通过Valuestack可以得到Root和ActionContext这两个对象
那么就是说,ValueStack和ActionContext它们是互相引用。
在ActionContext中有一个获得值栈的方法
ValueStack stack = ActionContext.getContext().getValueStack();
stack.set("name", "哈哈");
Object value = stack.findValue("哈哈");
从后两行对值栈的操作来看,ValueStack是一个Map集合,可是从上面的解释来看,ValueStack只是一个普通的接口,
其实在ValueStack内部封装了一个Map集合,就是一个用来存储数据的,
所以现在可以看ValueStack内部封装了三样东西:
List类型的 root
Map类型的 Context
还有一个Map用来存储数据,那么这个map在哪里呢,看下图:
也就是第三个Map被Root这个List引用,当调用set("name","哈哈")的时候,其实就是向Map中放数据,get("name")就是从这个Map中取值
证明: