浅谈struts2之chain[2]

简介:       上午写了,现在接着写下半部分:从源码的角度谈chain的机制   因为我的源码全是通过反编译jar包得来,不能保证100%的正确性,若遇到不对的地方,请大家指出.也请大家先谅解   在最后,用了一个简略图来表示chain机制:      但...

      上午写了<<浅谈struts2之chain[1]>>,现在接着写下半部分:从源码的角度谈chain的机制

  因为我的源码全是通过反编译jar包得来,不能保证100%的正确性,若遇到不对的地方,请大家指出.也请大家先谅解

  在<<浅谈struts2之chain[1]>>最后,用了一个简略图来表示chain机制:

  

  但实际上,如果考虑valuestack的话,这幅图应该这样画:

  

  对于此图中,关键性两个步骤:5和6, 实际上涉及到两个拦截器:

  1)chain

       2)params

  也就说,说chain方式的action之间共享valuestack是没有错的,说它们共享parameters也没有错

关键是它们的先后顺序及相互影响      我们来看一下struts-core-2.0.11.jar中struts-default.xml中对这两个拦截器的使用:

  
<interceptor-stack name="defaultStack">
          
......省略..........

         <interceptor-ref name="chain"/>
..................省略...........................

             
        <interceptor-ref name="params">
               
 </interceptor-stack>


记注意这两个拦截器的先后顺序:先是chain,然后才是params

这也就决定了上图中的执行顺序是:先执行5的动作后执行6的动作.

严格说来,上图中5,6,7,8的动作顺序描述,也不是很严谨,

真要说完全正确的执行顺序,实际上是先5,7然后再执行6,7,8.

关于这一点,只需要在调试状态上跟踪下action2中的set方法的调用堆栈就能理解.

 

好了,接下来我们说说chain和params的定义.还是在struts-default.xml中

  <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
      
  <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>


要说chain类型的result,实际上就是构建一条链接,把访问路径上的action对象全放在这个链条上,

先看下com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ActionInvocation invocation)

找到关键代码: OgnlUtil.copy(o, invocation.getAction(), ctxMap, excludes, includes);

这就是把action链条上,上一个action还有上上个action.....总之把action链条上前面访问的所有action对象

都执行OgnlUtil.copy(.......),也就是把它们的valuestack中的值都赋给当前action的valuestack

举个简单例子,有三个action

action1,action2,action3

当执行action2时,会把action1中valuestack的值赋给action2的valuestack

当执行action3时,会把先后把action1和action2中valuestack的值赋给action3的valuestack

依次类推.......

 

再来看下:com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ActionInvocation invocation)

其中关键方法调用: setParameters(action, stack, parameters);

把parameters中的内容赋给valuestack

 

但是,在实际使用过程,不推荐滥用chain

因为正如之前举的例子一样,当chain上有两个action的时候,

赋值过程实际上执行了3次=1+2:parameters到action1,action1到action2,parameters到action2

以此类推:有3个action时,赋值过程=6次=1+2+3

........

所以当链条上的action太多时,其实很费油的啦...

具体过程,空了画个图来表示下,大家就更容易明白了

 


 

  

相关文章
|
7月前
|
缓存 Java Spring
servlet/filter/listener/interceptor区别与联系
servlet/filter/listener/interceptor区别与联系
74 0
|
XML Java 数据安全/隐私保护
filter和interceptor的区别
filter和interceptor的区别
153 0
|
XML 安全 Java
filter和Interceptor
经常做web开发的人员对filter和Interceptor肯定都比较熟悉,它们都可以拦截请求及响应,在实际开发中可用来对参数进行过滤,对请求进行安全校验、记录操作日志,但是两者还是有本质区别。
182 0
1125. Chain the Ropes (25)
#include #include #include using namespace std; int main(){ int n; cin >> n; vector v(n); fo...
859 0
|
前端开发
struts2 中的 addActionError 、addFieldError、addActionMessage的方法
addActionError 、addFieldError、addActionMessage都是ActionSupport的方法   一、addActionError("错误内容"):Action级别的错误消息this.
1132 0
Struts2中获取Request,Response的几种方法
    在Struts2中的没有像Struts1那样必须要在Action类中写个execute()方法,只需要是个返回字符串的方法 即可(有时候也不需要返回值),在struts2中经将原有的servlet中request参数和response参数封装在拦截器 中,可是有时候编程的时候仍然需要用到这两个参数。
1139 0
Struts2.5 result中的chain
在执行完一个动作以后,如果想紧接着执行下一个动作,就可以使用chain,连接到下一个动作。 比如在执行了删除动作以后,需要返回原显示列表,就可以使用chain eg:         /students/Students_query_success.jsp     Students_query     query,delete                 上述例子便是在执行了,然后链接到了,跳转到/students/Students_query_success.jsp视图。