2014年12月23日火曜日

SastrutsのInterceptor機能を試してみる

概要

前回のチュートリアルでは主に「Action」と「Form」と「Dto」という機能について学びました
今回は「Interceptor」という機能について学んで行きます
Interceptorは共通処理を実行させるのに適した機能になります

環境

  • Windows7 64bit
  • Eclipse Luna 4.4.1
  • Apache Tomcat 7.0.56(設定はデフォルト)
  • JDK 1.8.0_25

サンプルコード

前回やったチュートリアル用のプロジェクトを使って話を進めていきます

パッケージを作る

tutorial.interceptorというパッケージを作成します
これは必須ではないですが今回はInterceptorクラスをこのパッケージで管理します

Actionクラスの確認

前回使ったtutorial.action.TestAction.javaをそのまま使います
特に拡張はしませんが動作することを確認しておいてください

Interceptorクラスを作成する

先ほど作成したtutorial.interceptorパッケージ配下にTestInterceptor.javaを作成します
TestInterceptor.javaはAbstractInterceptorクラスを継承してください
AbstractInterceptorクラスを継承すると自動的にinvokeメソッドを実装する必要があります

invokeメソッド内で引数のinvocationオブジェクトを使ってinvocation.proceed();をコールします
すると、Actionクラスのindex()メソッドが実行されます
つまりinvocation.proceed();の前後に処理を書くことでAction実行前後で決められた処理を自動的にコールすることができるようになります

package tutorial.interceptor;

import org.aopalliance.intercept.MethodInvocation;
import org.seasar.framework.aop.interceptors.AbstractInterceptor;

public class TestInterceptor extends AbstractInterceptor {

    /**
     * 識別番号
     */
    private static final long serialVersionUID = 1L;

    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("before");
        // これが実行されるとAction.index()メソッドが実行される
        Object object = invocation.proceed();
        System.out.println("after");
        return null;
    }

}

app.diconに追記する

作成したTestInterceptorを有効にするにはapp.diconに定義を追加する必要があります
<components>...</components>タグ内に以下の1行を追加してください

<component name="testInterceptor" class="tutorial.interceptor.TestInterceptor"/>

customizer.diconに追記する

面倒ですがもう1つのdiconファイルに設定を追記します
先ほどのapp.diconはcomponentを定義してcustomizer.diconでそのcomponentをどこで使うかの定義を記載する感じです
追加する部分は<component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">...</component>内に記載します

<initMethod name="addCustomizer">
    <arg>
        <component class="org.seasar.framework.container.customizer.AspectCustomizer">
            <property name="interceptorName">"testInterceptor"</property>
            <property name="useLookupAdapter">false</property>
            <initMethod name="addClassPattern">
                <arg>"tutorial.action"</arg>
                <arg>"TestAction"</arg>
            </initMethod>
        </component>
    </arg>
</initMethod>

addClassPatternを使うことで特定のパッケージのクラスにのみInterceptorを適用することができます
addClassPatterは内部的にはメソッドとして扱われており<arg>で引数を2つ取ります
1つ目の引数がパッケージ名で2つ目の引数がクラス名になります、この2つの引数は必須になります
クラス名やパッケージにはワイルドカードが使えるほか、複数指定する場合はカンマ区切りで指定してください

動作を確認する

Tomcatを一旦再起動しましょう

http://localhost:8080/sa-struts-tutorial/test/?message=helloにアクセスしてみましょう
ブラウザ上ではメッセージが表示されますがEclipse側のコンソールに「before, after」が表示されていると思います

紹介は以上です
Interceptorのだいたいの動きがわかったかと思います
メインロジックであるActionの前後で実施したい処理がある場合には重宝される機能だと思います

0 件のコメント:

コメントを投稿