# アダプタによる機能拡張

アダプタ (CongaServletAdapter) を実装することにより，ログ出力，認証済かどうかのチェックなど「ビジネスロジックではないけど，共通的な機能」を提供することができます。

まずは，アダプタの機能と実装に関するイメージをつかんでもらうため，ここでは「例外発生時のログ出力」機能を実装する方法を例として説明します。

アダプタを使うために，開発者は以下の２つを行ないます。

- アダプタの実装： CongaServletAdapter クラスを継承し，必要なメソッドをオーバーライドする
- アダプタの定義： web.xml の init-param に作成したクラスを定義する

## アダプタの実装

アダプタを作成するには，CongaServletAdapter クラスを継承したクラスを作成し，必要なメソッドの実装を行ないます。

    package test;

    import nga.servlet.ServiceInfo;
    import nga.servlet.spi.CongaServletAdapter;

    public class ExceptionLogger extends CongaServletAdapter {

        public void abort(ServiceInfo serviceInfo, Throwable exception) {
            serviceInfo.getServlet().log("Error!", exception);
        }

    }

この例では，例外発生時のログ出力を行なうため，例外発生のタイミングで呼び出される abort メソッドをオーバーライドし，Servlet の log メソッドを呼び出しています。

メソッド引数として渡される ServiceInfo には CongaServlet インスタンス，設定ファイルのタグ情報，セッション等，CongaServlet の service メソッド実行時に利用できるあらゆる情報が格納されています。

## アダプタの定義

実装したアダプタメソッドが CongaServlet 実行時に呼び出されるようにするためには，web.xml の init-param の中で，nga.servlet.adapter を定義します。

       <init-param>
         <param-name>nga.servlet.adapter</param-name>
         <param-value>test.ExceptionLogger</param-value>
        </init-param>

ちなみに，複数のアダプタクラスを呼び出したい場合は，"test.ExceptionLogger, test.InfoLogger" というように "," で区切って記述します。

## アダプタメソッドが呼び出されるタイミング

アダプタのメソッドが呼び出されるのは以下のタイミングです。

詳細は，API リファレンスをご覧下さい。

TOP