プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Java、SAStruts、インターセプターを作る
開始、終了ログの出力とかログイン済みチェックとかやりたくてですね。
要は共通前処理とか共通後処理とか呼ばれる奴を実装したかったのです。

ほんで調べてみたら「インターセプター」とかいうのを使えば出来るらしい。
「インターセプター」ってのは・・・なんでしょね(--?
私はActionとかServiceの前に割り込んで動く奴くらいのイメージです。
文字通りインターセプトしてくれる奴。

使い方はこんな感じφ(--)
※取り合えずActionメソッド開始・終了のログを出すように実装してみました。
 ログはlog4jを使用。

1.インターセプターを作る。
 パッケージはなんでも良いのかもしれませんが、
 「うんちゃら.interceptor」にしておくと勝手に色々やってくれて便利。

  package hoge.interceptor;

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

  @SuppressWarnings("serial")
  public class InitInterceptor extends AbstractInterceptor {
      Logger logger = Logger.getLogger(getClass());
  
      @Override
      public Object invoke(MethodInvocation arg0) throws Throwable {
          //ログ出力情報を取得
           String className = getTargetClass(arg0).getSimpleName();
           String methodName = arg0.getMethod().getName();
           String actionName = className + "#" + methodName;
  
           //処理開始ログ出力
          logger.info("\n/////////////////////////:" + actionName + "を開始します。");
  
           //主処理
          Object ret = arg0.proceed();
  
           //処理終了ログ出力
          logger.info("\n/////////////////////////:" + actionName + "が終了しました。");
  
          return ret;
      }
  }


ちなみに「Object ret = arg0.proceed();」の部分で
Actionなり次のインターセプターなりに制御が移ります。
「Object ret = arg0.proceed();」の前に書くと前処理、
後に書くと後処理になりますよ。

2.「customizer.dicon」に追加。

  <initMethod name="addCustomizer">
      <arg>
          <component class="org.seasar.framework.container.customizer.AspectCustomizer">
              <property name="interceptorName">"initInterceptor"</property>
  <!--                <property name="pointcut">".*"</property>-->
          </component>
      </arg>
  </initMethod>




<component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">

ここらへん

</component>


に追加します。
「interceptorName」の「initInterceptor」部分は
インターセプターのクラス名を先頭小文字にした奴ね。

ちなみに一部のアクションには該当インターセプターを割り当てたくない場合は
「addIgnoreClassPattern」で除外パターンを指定します。

こいつφ(--)はログイン処理用のインターセプターを指定しているのですが、
ErrAction呼ばれた場合はこのインターセプターを経由しません。φ(--)

    <initMethod name="addCustomizer">
        <arg>
            <component class="org.seasar.framework.container.customizer.AspectCustomizer">
                <property name="interceptorName">"loginCheckInterceptor"</property>
<!--                <property name="pointcut">".*"</property>-->
                <property name="useLookupAdapter">true</property>

                <initMethod name="addIgnoreClassPattern">
                    <arg>"hoge.action"</arg>
                    <arg>"Err.*"</arg>
                </initMethod>

            </component>
        </arg>
    </initMethod>


更に余談ですが、インターセプターは複数経由させることも出来ます。
私は全アクションでログ出力を、エラー画面以外でログイン済みチェックをするように
実装しました。
単純にインターセプターを複数作って大根に全部記述すればOK。
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● Java  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事