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