Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Servlet・JSP > Servlet −9.リスナー(HttpSession)
更新日:2011/7/31
Servlet−9.リスナー(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(HttpSessionBindingEvent)
sessionスコープを持つデータが追加されたときに呼び出されるメソッドです。
void
attributeReplaced(HttpSessionBindingEvent)
sessionスコープを持つデータが置換されたときに呼び出されるメソッドです。
void
attributeRemoved(HttpSessionBindingEvent)
sessionスコープを持つデータが削除されたときに呼び出されるメソッドです。
メソッドの引数に指定されているHttpSessionBindingEventクラスには以下のメソッドが定義されています。
戻り型
メソッド
説明
HttpSession
getSession( )
対象のHttpSessionオブジェクトを返します。
String
getName( )
追加、置換、削除されたデータの名前を返します。
Object
getValue( )
追加、置換、削除されたデータの値を返します。
HttpSessionBindingListenerインタフェース
HttpSessionBindingListenerインタフェースには以下のメソッドが定義されています。
戻り型
メソッド
説明
void
valueBound(HttpSessionBindingEvent)
オブジェクトがセッションに追加されたときに呼び出されるメソッドです。
void
valueUnbound(HttpSessionBindingEvent)
オブジェクトがセッションから削除されたときに呼び出されるメソッドです。
メソッドの引数に指定されているHttpSessionBindingEventクラスに関しては、上記のHttpSessionAttributeListenerインタフェースに記載しています。
HttpSessionActivationListenerインタフェース
HttpSessionActivationListenerインタフェースには以下のメソッドが定義されています。
戻り型
メソッド
説明
void
sessionDidActivate(HttpSessionEvent)
セッションが活性化された直後に呼び出されるメソッドです。
void
sessionWillPassivate(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



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道