当action的返回结果类型为chain时,chain拦截器就会发生作用,把当前action和目标action都压入值栈。
那么如果目标action的返回结果依然是chain呢?当然也把目标action的目标也压入值栈。
亦即是说,
<action name="a" class="A"> <result name="success" type="chain"> <param name="actionName">b</param> </result> </action> <action name="b" class="B"> <result name="success" type="chain"> <param name="actionName">c</param> </result> </action> <action name="c" class="C"> <result name="success">someview</result> </action>
在someview里加个s:debug标签,可以看到valueStack里有四个对象。
但是如果改一下,
<action name="a" class="A"> <result name="success" type="chain"> <param name="actionName">b</param> </result> </action> <action name="b" class="B"> <result name="success">Bview</result> </action> <action name="b2" method="bm" class="B"> <result name="success" type="chain"> <param name="actionName">c</param> </result> </action> <action name="c" class="C"> <result name="success">someview</result> </action>
在Bview里提交到b2,再转到someview,这时值栈里只有三个对象,除了DefaultTextProvider外是B和C,A已经没有了。
也就是说action链是以request为生命周期的。当一个请求结束返回视图后,链的内容就固定了,也不会再保存了。当下一次请求开始时,链会重新生成。