Javaに関する様々な情報をご紹介します。

9リスナー(HttpSession)

Javaに関する様々な情報をご紹介します。

リスナー(HttpSession)

リスナーとは、Webアプリケーションに何らかのイベントが発生した際にそれをプログラムに通知する機能です。この機能により、イベントの発生と連動したプログラムの実行を行うことができるようになります。ここでは、HttpSessionオブジェクト関連のイベントが発生した際に呼び出されるリスナーについて解説します。

概要

HttpSession関連のリスナーには、HttpSessionListenerインタフェース、HttpSessionAttributeListenerインタフェース、HttpSessionBindingListenerインタフェース、HttpSessionActivationListenerインタフェースの4つがあります。

HttpSessionListenerインタフェース
セッションが作成されるときや破棄されるときに呼び出されます。セッション数の把握、セッション作成時の初期化処理の際などに使用します。
HttpSessionAttributeListenerインタフェース
sessionスコープを持つデータが追加・置換・削除されたときに呼び出されます。該当のデータに変更があったときにその変更をログに出力したい場合などに使用します。
HttpSessionBindingListenerインタフェース
このインタフェースを実装したクラスのオブジェクトがセッションに追加・削除されたときに呼び出されます。HttpSessionAttributeListenerインタフェースとの違いは、このインタフェースを実装したクラスのオブジェクトのみがリスナーの対象となることです。
HttpSessionActivationListenerインタフェース
分散環境やセッションを永続的に保持するコンテナなどで、セッションが活性化・非活性化されるときに呼び出されます。

HttpSessionListenerインタフェース

HttpSessionListenerインタフェースには以下のメソッドが定義されています。

戻り型 メソッド 説明
void sessionCreated(
HttpSessionEvent)
セッションが作成されたときに呼び出されるメソッドです。
void sessionDestroyed(
HttpSessionEvent)
セッションが破棄されたときに呼び出されるメソッドです。

メソッドの引数に指定されているHttpSessionEventクラスには以下のメソッドが定義されています。

戻り型 メソッド 説明
HttpSession getSession( ) 対象のHttpSessionオブジェクトを返します。

HttpSessionAttributeListenerインタフェース

HttpSessionAttributeListenerインタフェースには以下のメソッドが定義されています。

戻り型 メソッド 説明
void attributeAdded(
HttpSession
BindingEvent)
sessionスコープを持つデータが追加されたときに呼び出されるメソッドです。
void attributeReplaced(
HttpSession
BindingEvent)
sessionスコープを持つデータが置換されたときに呼び出されるメソッドです。
void attributeRemoved(
HttpSession
BindingEvent)
sessionスコープを持つデータが削除されたときに呼び出されるメソッドです。

メソッドの引数に指定されているHttpSessionBindingEventクラスには以下のメソッドが定義されています。

戻り型 メソッド 説明
Http
Session
getSession( ) 対象のHttpSessionオブジェクトを返します。
String getName( ) 追加、置換、削除されたデータの名前を返します。
Object getValue( ) 追加、置換、削除されたデータの値を返します。

HttpSessionBindingListenerインタフェース

HttpSessionBindingListenerインタフェースには以下のメソッドが定義されています。

戻り型 メソッド 説明
void valueBound(
HttpSession
BindingEvent)
オブジェクトがセッションに追加されたときに呼び出されるメソッドです。
void valueUnbound(
HttpSession
BindingEvent)
オブジェクトがセッションから削除されたときに呼び出されるメソッドです。

メソッドの引数に指定されているHttpSessionBindingEventクラスに関しては、上記のHttpSessionAttributeListenerインタフェースに記載しています。

HttpSessionActivationListenerインタフェース

HttpSessionActivationListenerインタフェースには以下のメソッドが定義されています。

戻り型 メソッド 説明
void sessionDid
Activate(
HttpSessionEvent)
セッションが活性化された直後に呼び出されるメソッドです。
void sessionWill
Passivate(
HttpSessionEvent)
セッションが非活性化される直前に呼び出されるメソッドです。

メソッドの引数に指定されているHttpSessionEventクラスに関しては、上記のHttpSessionListenerインタフェースに記載しています。

web.xmlの設定

HttpSession関連のリスナーの内、HttpSessionListenerインタフェース、HttpSessionAttributeListenerインタフェースは、インタフェースを実装したリスナークラスをweb.xmlに指定する必要があります。リスナークラスの設定は<listener>タグで行います。<listener>タグは<web-app>タグ内に記載します。その他のリスナーインターフェースを実装したリスナークラスはweb.xmlに指定する必要はありません。

<listener>タグのサブ要素

要素 内容 要素数
description リスナーの説明を記載します。 0以上
display-name GUIツールで表示されるリスナーの名前を記載します。 0以上
icon GUIツールで表示される画像を指定します。 0以上
listener-class リスナーインタフェースを実装したServletクラスを記載します。 1

使用例

HttpSessionListenerインタフェースの使用例について解説します。セッションが作成されたときにセッション数をカウントし、ログに記載するプログラムです。

【CheckSessionServlet.java】セッションの作成を監視するリスナークラスです。

import javax.servlet.*;
import javax.servlet.http.*;

//(1)HttpSessionListenerインタフェースを実装したリスナークラスを宣言します。
public class CheckSessionServlet implements HttpSessionListener {
    private static int sesCount = 0;

    //(2)セッションが作成されたときに呼び出される
    //   sessionCreatedメソッドでセッション数を加算する処理と、
    //   加算されたセッション数をログに記載する処理を行います。
    public void sessionCreated(HttpSessionEvent hse) {
        sesCount++;
        ServletContext sc = hse.getSession().getServletContext();
        sc.log("Now Session Count : " + sesCount);
    }

    //(3)セッションが破棄されたときに呼び出される
    //   sessionDestroyedメソッドでセッション数を
    //   減算する処理を行います。
    public void sessionDestroyed(HttpSessionEvent hse) {
        sesCount--;
    }
}

【AddSessionServlet.java】セッションを作成するプログラムです。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class AddSessionServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        
        //(1)getSessionメソッドで、セッションが作成されていない場合、
        //   新たなセッションを作成します。
        HttpSession hs1 = req.getSession();
        res.setContentType("text/html; charset=Windows-31J");
        
        PrintWriter out = res.getWriter();
        out.println("<HTML><HEAD>");
        out.println("<meta http-equiv=\"Content-Type\" " +
            "content=\"text/html; charset=Shift_JIS\">");
        out.println("</HEAD><BODY>");
        out.println("セッションの作成");
        out.println("</BODY></HTML>");
    }
}

【web.xml】リスナークラス(CheckSessionServlet.java)とServletクラス(AddSessionServlet.java)を登録します。

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>
    <!-- (1)リスナークラスを登録します。 -->
    <listener>
        <listener-class>CheckSessionServlet</listener-class>
    </listener>
    <servlet>
        <servlet-name>AddSessionServlet</servlet-name>
        <servlet-class>AddSessionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AddSessionServlet</servlet-name>
        <url-pattern>/AddSessionServlet</url-pattern>
    </servlet-mapping>
</web-app>

【実行結果】ServletプログラムAddSessionServletにアクセスした後、ログにカウントされたセッション数が記載されていることが確認できます。リスナークラスは通常のServletプログラムと同様にコンテキストルート\WEB-INF\classesディレクトリ配下に配置します。Servletプログラムの実行方法に関しては、Javaの道:Tomcat(プログラム配置・実行)を参照してください。

Javaの道_リスナー
---------------------------------
---------------------------------

# ログにセッション数が記載されていることが確認できます。
2004-09-21 23:33:51 StandardContext[/serTest]Now Session Count : 1
2004-09-21 23:34:53 StandardContext[/serTest]Now Session Count : 2

9リスナー(HttpSession)