Java Webアプリケーションにおけるイベントリスナーの実装と登録

Java Servlet環境では、Webアプリケーションのライフサイクルやユーザーのセッション状態など、さまざまなシステムレベルのイベントが発生します。これらのイベント(例:アプリケーション起動/終了、HTTPセッション生成/破棄、リクエスト開始/完了)は通常自動的に処理されますが、開発者は必要に応じてカスタムロジックを挿入できます。その手段として、Servlet APIは一連のリスナーオブジェクトを提供しています。

リスナーの導入フロー

  1. 対応するインタフェースを実装したクラスを作成する
  2. そのクラスをWebコンテナに登録する(アノテーションまたはデプロイ記述子経由)

主なリスナーインタフェースと用途

  • ServletContextListener:アプリケーション全体の初期化・終了時刻をキャッチ
  • ServletContextAttributeListener:applicationスコープ内の属性追加・削除・変更を監視
  • ServletRequestListener:各HTTPリクエストの生成・破棄タイミングを検知
  • ServletRequestAttributeListener:requestスコープ属性の変更をトラッキング
  • HttpSessionListener:ユーザーのセッション作成・無効化を検出
  • HttpSessionAttributeListener:session内での属性操作を監視

登録方法の選択肢

Servlet 3.0以降では、@WebListenerアノテーションによる宣言的登録が可能です。一方、従来のXMLベースの設定では<listener>要素をweb.xmlに追加します。

実装例:アプリケーション起動時のログ出力

以下は、サーバー起動時にコンソールにメッセージを出力するリスナーです。

package jp.example.lifecycle;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class ApplicationBootListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        String appName = event.getServletContext().getServletContextName();
        System.out.printf("[INFO] アプリケーション '%s' が起動しました。\n", appName);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        String appName = event.getServletContext().getServletContextName();
        System.out.printf("[INFO] アプリケーション '%s' が停止しました。\n", appName);
    }
}

上記クラスはアノテーションで登録済みのため、web.xmlへの明示的な記述は不要です。ただし、Servlet 2.5以前の環境や、特定のコンテナ制約下では、代わりに以下のXML構文を使用します:

<listener>
  <listener-class>jp.example.lifecycle.ApplicationBootListener</listener-class>
</listener>

補足

各リスナーインタフェースは、イベント発生時に呼び出されるコールバックメソッドを定義しており、実装クラスは必要なメソッドのみをオーバーライドすれば十分です。たとえば、セッションの開始のみを監視したい場合はHttpSessionListenerのsessionCreated()のみ実装し、sessionDestroyed()は空実装または省略(デフォルト実装あり)とすることも可能です。

タグ: Servlet WebListener ServletContextListener HttpSession Web.xml

9月19日 17:09 投稿