常用拦截器的执行步骤

来源:互联网 发布:生存之民工 知乎 编辑:程序博客网 时间:2024/05/16 14:31

.总结

  1. 常用拦截器的执行步骤
  2. 登录中的拦截器执行过程
    1. 首先执行默认拦截器DefaultActionInvocation
      1. 首先执行其中的init方法
        1. 该方法创建Action,并将Action压入栈顶

    1. 然后执行模型驱动拦截器ModelDrivenInterceptor
      1. 首先执行其中的intercept方法
        1. 该方法中获取模型驱动,并将模型压入栈顶

      2. 然后继续执行默认拦截器DefaultActionInvocation
        1. 执行该拦截器中的invoke方法
    2. 然后执行赋值拦截器ParametersInterceptor
      1. 首先执行其中的doIntercept方法
        1. 该方法中获取request请求中的parameterMap中的请求数据。
        2. 然后调用setParameters(final Object action, ValueStack stack, final Map<String, Object> parameters)方法
          1. 在该方法中为Action中的属性赋值。

  3. 保存功能,拦截器的执行过程。
    1. 首先执行默认拦截器DefaultActionInvocation
      1. 执行其中的init方法,创建action并压入栈顶
    2. 然后执行ModelDrivenInterceptor
      1. 走了两次
        1. 一次是执行拦截器:actionMappingParams, Action映射赋值
        2. 一次是执行拦截器:Params,属性赋值
    3. 执行ParametersInterceptor
      1. 此时parameters中无数据
    4. 再执行DefaultActionInvocation
    5. 再执行ParametersInterceptor
      1. 此时parameters中有页面传过来的数据
  4. 总结:
    1. 实现模型驱动接口的Actionstruts赋值执行流程
      1. 首先执行DefaultActionInvocation<com.opensymphony.xwork2.DefaultActionInvocation>判断要执行的拦截器,在该拦截器的init初始化方法中将请求的Action压入stack栈顶,然后执行invoke方法调用不同的拦截器
      2. DeafaultActionInvocationinvoke方法要执行modelDrive拦截器的时候,调用ModelDriven<com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor>拦截器。ModelDriven拦截器只负责将Model模型压入栈顶,也就是说此时action中的模型已经在栈中在ModelDriven压入的模型的下面。
      3. DeafaultActionInvocationinvoke方法要执行ActionMapping拦截器的时候,调用ParametersInterceptor<com.opensymphony.xwork2.interceptor.ParametersInterceptor>拦截器进行映射关系赋值。此时页面提交过来的parameters为空。
      4. DeafaultActionInvocationinvoke方法要执行params拦截器的时候,调用ParametersInterceptor拦截器进行Action属性赋值,此时页面提交过来的parameters有数据。
        1. 由于stack栈顶是ModelDriven拦截器压入的模型,所以赋值以该模型为先。就是说如果ModelDriven压入栈中的模型中如果存在与Action中属性名重名的属性,struts2params拦截器会以ModelDriven压入栈的模型为先赋值、赋值结束后不会再对Action中同名属性进行赋值。如果ModelDriven压入栈的模型因为数据类型或者其他的原因赋值失败了,需要注意的是params拦截器也会终止为该属性继续赋值
        2. Struts2拦截器赋值需要注意两点:
          1. 赋值时按照对象名称进行检索
          2. 赋值的时候对象在栈中的先后顺序决定了该对象是否会被赋值。
      5. 这个知识点是由于页面中的表单数据无法为目标Action中的属性赋值引起的?
        1. 原因就是因为模型驱动中提供了与Action中同名的属性
          来源: http://blog.csdn.net/ranmudaofa/article/details/41996275
0 0