Struts2 Interceptor

interceptorの作成

com.opensymphony.xwork2.interceptor.Interceptor を implements するか
com.opensymphony.xwork2.interceptor.AbstractInterceptor を extends する

public class TestInterceptor extends AbstractInterceptor {
    @Override public String intercept(ActionInvocation invocation) throws Exception {
        String result;
        // before
        result = invocation.invoke();
        // after
        return result;
    }
}

interceptorの適用

struts.xmlなどにタグを利用して定義する。

<package name="" extends="struts-default">
  <interceptors>
    <interceptor name="testInterceptor"
        class="hoge.foo.bar.TextInterceptor" />
  </interceptors>
  <action name="hogeAction" class="hogeAction">
    <interceptor-ref name="testInterceptor" />
    <result>/success.jsp</result>
  </action>
</package>

アクションに適用するにはタグの内側でを使って設定。
このままだとはまってしまうので注意が必要。
実際この状態で実行すると、Struts2標準のinterceptorが適用されず自前のものしか動作しない。
なんでだろと調べてみると。
Struts2のinterceptorはStackの概念があり、適用する順にStackに積み上げられていると。
それはstruts-defaultパッケージで定義される。(struts-default.xmlをみるとわかる)
その中でdefaultStackていうのが名前の通り標準で適用されるinterceptorの定義参照名。
これが先の設定ファイルの書き方だと無効になって自前のしか動かなかったらしい。
んでは、どうするかというと…Stackに積んでしまえばOK。

<package name="" extends="struts-default">
  <interceptors>
    <interceptor name="testInterceptor"
        class="hoge.foo.bar.TextInterceptor" />
    <interceptor-stack name="testDefault">
      <interceptor-ref name="defaultStack" />
      <interceptor-ref name="testInterceptor" />
    </interceptor-stack>
  </interceptors>
  <action name="hogeAction" class="hogeAction">
    <interceptor-ref name="testDefault" />
    <result>/success.jsp</result>
  </action>
</package>

これで既存のinterceptor群の最後に自作interceptorが追加される。(testInterceptorを先に書くと最初に実行される)
つどStackに積む(定義し直す)のは面倒なので、アプリ用標準パッケージを定義した方が実際には便利かも。
こちらのサイトが参考になりました。→Struts2を使ってみる
英語のリファレンスはやっぱり読みづらいね…。


このInterceptorの機能だけど、標準でアクションに対してAOP仕掛けられるんで使い道ありそう。
ぱっと思い浮かぶのはログイン認証の確認とか。
SpringAcegiもあるけど、意外と設定面倒だしね。
interceptorでシンプルに実装できる気がするのでいいかも。
View層周りはStruts1.xより使いかってよくなってる印象だわ。
ただ、個人的にOGNLがよくわかってませんorz