Struts2 拦截器调用过程、ModelDrivenIntercepto拦截器和ParametersInterceptor拦截器简单介绍

.总结

  1. 常用拦截器的执行步骤
  2. 登录中的拦截器执行过程
    1. 首先执行默认拦截器DefaultActionInvocation
      1. 首先执行其中的init方法
        1. 该方法创建Action,并将Action压入栈顶
        2. Struts2 拦截器调用过程、ModelDrivenIntercepto拦截器和ParametersInterceptor拦截器简单介绍_第1张图片
    1. 然后执行模型驱动拦截器ModelDrivenInterceptor
      1. 首先执行其中的intercept方法
        1. 该方法中获取模型驱动,并将模型压入栈顶
        2. Struts2 拦截器调用过程、ModelDrivenIntercepto拦截器和ParametersInterceptor拦截器简单介绍_第2张图片
      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中的属性赋值。
          2. Struts2 拦截器调用过程、ModelDrivenIntercepto拦截器和ParametersInterceptor拦截器简单介绍_第3张图片
  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中同名的属性。

你可能感兴趣的:(struts2)