struts2 valueStack 解析(源码解读)

1 什么是valueStack

  我们首先看一下struts2核心过滤器的源码。

  我们查看deFilter方法,我们跟进execute.executeAction(request, response, mapping); 再次跟进直到Dispatcher类中

  

 讲解一下上面的源码,我们重点查看蓝色选中的代码,我们就是首先在request里面取出值栈对象,

我们可以查看一下上面的key,跟进发现 public static final String STRUTS_VALUESTACK_KEY = "struts.valueStack";

在我们第一次访问的时候,值栈对象肯定是空的,我们查看上面的第二个if的代码块,也就是ctx.getContext(),

  public ValueStack getValueStack() {
        return (ValueStack) get(VALUE_STACK);
    }



 上面的代码就是

 这个也就是获得valueStack的源码。我们获得了valueStack之后,我们就直接把valueStack放进了request域对象里面了

根据上面的分析,我们知道每一次发起请求,valueStack都是从request里面取值,但是每一次请求最开始valueStack

都是空的,所以都是后面的ActionContext中取出valueStack值,所以一个请求一个valueStack,valueStack的生命周期和一个

request的生命周期是相同的,都是从一个请求开始,然后当给出相应的时候,结束。

2 valueStack 的内部结构

  在struts中,对ognlContext进行了包装,我们查看valueStack的源码

 

  这个CompoundRoot这个就是valueStack的根节点,我们跟进查看这个compoundRoot,我们发现其实CompoundRoot继承了ArrayList,也就是说valueStack的root就是一个ArrayList集合。而valueStack的context对象其实就是ognlContext, 这个context是一个map集合,在context中,存储的都是一些常见的web元素。例如request,等常见的web元素。 其实struts2在设计的时候,非常有意思,在这个context中,也包含上面的root的,只不过struts2把这个root给抽取出来了,单独的做成了一个结构,然后在context中存储的是root的引用。对于context是ognlcontext我们可以给出证明。



 上面我们给出的是valueStack的实现类,我们在setRoot方法中,我们可以发现这个在最后被强转成了ognlcontext,我们查看下面的图片,可以让我们更好的理解值栈的内部结构。

 

 

猜你喜欢

转载自1193355343.iteye.com/blog/2375017