概要
前回のチュートリアルでは主に「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の前後で実施したい処理がある場合には重宝される機能だと思います