1

struts 2 アクション内に複数のネストされたインターセプターがあるとします。

  • ふー
    • バー
      • バズ

各インターセプターは、intercept()メソッドで次のことを行っています

String result = invocation.invoke();
return result;

invocation.invoke()が呼び出されると、これはキュー内の次のインターセプターのメソッドを呼び出しますintercept()か、それとも実際にaction.execute()メソッドを呼び出しますか?

たとえば、 の場合、これは をfoo呼び出しますか、それとも実際に を呼び出しますか?invocation.invoke()bar.intercept()action.execute()

後者の場合、bar.intercept()or baz.intercept()(bar インターセプターから呼び出された場合) を before に呼び出すにはどうすればよいですか?action.execute()つまり、すべてのインターセプターが呼び出される前に実行さaction.execute()れますか?

4

2 に答える 2

2

Action一度だけ実行します。1つInterceptors前処理( を呼び出す前invoke()) で、もう 1 つは後処理( を呼び出した後invoke()) です。

したがって、あなたの例では、次のようになります。

foo calls invoke() -> calls bar#intercept()
bar calls invoke() -> calls baz#intercept()
baz calls invoke() -> calls action#execute()

action#execute() returns -> baz executes lines after invoke()
baz#intercept() returns -> bar executes lines after invoke()
bar#intercept() returns -> foo executes lines after invoke()

Interceptorsお互いに直接電話することは絶対にありませんのでご注意ください。すべての呼び出しはフレームワークを通過する必要がありますStruts 2。そのため、このフロー全体をほぼ調整invoke()するオブジェクトで が呼び出されます。ActionInvocation

于 2013-10-11T05:25:50.957 に答える
2

action.execute()メソッドが実行される前に、スタック内のすべてのインターセプターが呼び出されます。この場合、以下の順番になります。

  1. foo.intercept()
  2. bar.intercept()
  3. baz.intercept()
  4. action.execute()
于 2013-10-11T05:25:54.947 に答える