代码之家  ›  专栏  ›  技术社区  ›  James McMahon

在interceptor.intercept()中,如何知道该操作是否已被执行?

  •  2
  • James McMahon  · 技术社区  · 14 年前

    我正在使用拦截器在基于Struts的应用程序中实现一些东西,我对它们的生命周期如何工作感到困惑。根据Struts文件( "Interceptors" , "Writing interceptors" "Big picture" )应该是这样的:

    FirstInterceptor
      NextInterceptor
        LastInterceptor
          Action
          Result
        LastInterceptor
      NextInterceptor
    FirstInterceptor
    

    这是有道理的,但是我在如何区分在操作之前执行的拦截器调用和在结果呈现之后执行的拦截器调用(我跳过 PreResultListener 在这里)。 如果我启动一个调试器,我会接到两个调用 intercept() 也找不到太明显的 ActionInvocation 我被淘汰了。 ( 更新 :这一部分对我来说是一个很大的困惑,我一拿到问题就可以回答下面的问题)

    这个 “大局” page提到的“before”和“after”子句有些令人困惑,但我不知道该如何理解:

    […]

    这包括在调用操作本身之前调用任何拦截器(before子句)。

    […]

    拦截器再次执行(顺序相反,调用after子句)。

    […]

    ( 更新 :这两个句子还是不好的)

    1 回复  |  直到 12 年前
        1
  •  2
  •   James McMahon    14 年前

    对拦截器没有两个调用:

    public class MyInterceptor implements Interceptor {
    
        public String intercept(ActionInvocation invocation) {
            /*
            This is before Action.execute(),
            and before all interceptors down the stack
            */
    
            String code = invocation.invoke();
    
            /*
            This is after Action.execute(),
            the result rendering and all
            interceptors down the stack,
            but before the interceptors
            higher up in the stack.
            */
    
            return code;
        }
    
    }
    

    (请注意,我在调试器中看到的“两次截获调用”是由于我没有注意到的不太明显的重定向导致的。这让我很困惑。)