ヘッダーをスキップ

Oracle Containers for J2EE サーブレット開発者ガイド
10g(10.1.3.1.0)

B31859-01
目次
目次
索引
索引

戻る 次へ

5 イベント・リスナーの理解および使用方法

サーブレット仕様には、イベント・リスナーを使用してWebアプリケーションの主要イベントを追跡する機能が含まれています(イベント・リスナーの概要は、「サーブレット通知にイベント・リスナーを使用する場面」を参照)。リスナーを使用すると、イベントの状態に基づいた自動処理やより効率的なリソース管理を実行できます。リスナーは、リクエスト・イベント、セッション・イベントおよびサーブレット・コンテキスト・イベントについて実装できます。これについて、次の項で説明します。

イベント・リスナー機能の概要

次の8つのイベント・リスナー・カテゴリがあります。

これらのイベント・カテゴリごとに1つ以上のイベント・リスナー・クラスを作成できます。また、1つのリスナー・クラスが、複数のイベント・カテゴリを監視できます。

イベント・リスナー・クラスを作成するには、javax.servletまたはjavax.servlet.httpパッケージの適切なインタフェースを1つ以上実装します。表5-1は、カテゴリと関連するインタフェースをまとめたものです。

表5-1    イベント・リスナーのカテゴリとインタフェース 
イベント・カテゴリ  イベントの説明  Javaインタフェース 

サーブレット・コンテキストのライフ・サイクル 

サーブレット・コンテキストの作成(最初のリクエストに対応できる時点)

サーブレット・コンテキストの緊急停止 

javax.servlet.ServletContextListener 

サーブレット・コンテキスト属性 

サーブレット・コンテキスト属性の追加

サーブレット・コンテキスト属性の削除

サーブレット・コンテキスト属性の置換 

javax.servlet.ServletContextAttributeListener 

セッション・ライフ・サイクル 

セッションの作成

セッションの無効化

セッションのタイムアウト 

javax.servlet.http.HttpSessionListener 

セッション属性 

セッション属性の追加

セッション属性の削除

セッション属性の置換 

javax.servlet.http.HttpSessionAttributeListener 

セッションの移行 

セッションのアクティブ化

セッションの非アクティブ化 

javax.servlet.HttpSessionActivationListener 

セッション・オブジェクトのバインド 

セッションへのオブジェクトのバインド

セッションからのオブジェクトのアンバインド 

javax.servlet.HttpSessionBindingListener 

リクエストのライフ・サイクル 

リクエスト処理の開始 

javax.servlet.ServletRequestListener 

リクエスト属性 

セッション属性の追加

セッション属性の削除

セッション属性の置換 

javax.servlet.ServletRequestAttributeListener 

リスナーは、web.xmlファイルの<listener>要素(<web-app>要素のサブ要素)を使用して構成します。 「リスナーの構成」を参照してください。

アプリケーションの起動後およびアプリケーションが最初のリクエストを処理する前に、サーブレット・コンテナは、web.xmlで宣言されている各リスナー・クラスのインスタンスを作成および登録します。各イベント・カテゴリのリスナーは、宣言された順序で登録されます。その結果、アプリケーションの実行時に、各カテゴリのイベント・リスナーは、登録順に起動されます。すべてのリスナーは、アプリケーションの最後のリクエストが処理されるまで、アクティブ状態のままです。

イベント・リスナー・インタフェース

この項では、表5-1にまとめたインタフェースのメソッドについて説明します。この項で説明する各メソッドは、該当するイベントが発生したときにサーブレット・コンテナによってコールされます。これらのメソッドは、様々なタイプのイベント・オブジェクトを入力として取得するため、各イベント・クラスとそのメソッドについても説明します。

ServletContextListenerメソッド、ServletContextEventクラス

ServletContextListenerインタフェースは、次のメソッドを指定します。このインタフェースは、サーブレット・コンテキストのライフ・サイクル・イベントを追跡するために使用するクラスに実装します。

サーブレット・コンテナは、ServletContextListenerメソッドのコールに対して入力されるjavax.servlet.ServletContextEventオブジェクトを作成します。ServletContextEventクラスには、リスナーがコール可能な次のメソッドが含まれています。

ServletContextAttributeListenerメソッド、ServletContextAttributeEventクラス

ServletContextAttributeListenerインタフェースは、次のメソッドを指定します。このインタフェースは、サーブレット・コンテキストの属性イベントを追跡するために使用するクラスに実装します。

サーブレット・コンテナは、ServletContextAttributeListenerメソッドのコールに対して入力されるjavax.servlet.ServletContextAttributeEventオブジェクトを作成します。ServletContextAttributeEventクラスには、リスナーがコール可能な次のメソッドが含まれています。

HttpSessionListenerメソッド、HttpSessionEventクラス

HttpSessionListenerインタフェースは、次のメソッドを指定します。このインタフェースは、セッションのライフ・サイクル・イベントを追跡するために使用するリスナー・クラスに実装します。

サーブレット・コンテナは、HttpSessionListenerメソッドのコールに対して入力されるjavax.servlet.http.HttpSessionEventオブジェクトを作成します。HttpSessionEventクラスには、リスナーがコール可能な次のメソッドが含まれています。

HttpSessionAttributeListenerメソッド、HttpSessionBindingEventクラス

HttpSessionAttributeListenerインタフェースは、次のメソッドを指定します。このインタフェースは、セッションの属性イベントを追跡するために使用するリスナー・クラスに実装します。

サーブレット・コンテナは、HttpSessionAttributeListenerメソッドのコールに対して入力されるjavax.servlet.http.HttpSessionBindingEventオブジェクトを作成します。HttpSessionBindingEventクラスには、リスナーがコール可能な次のメソッドが含まれています。

HttpSessionActivationListenerメソッド

HttpSessionActivationListenerインタフェースは、次のメソッドを指定します。このインタフェースは、セッションの移行(アクティブ化または非アクティブ化)イベントを追跡するために使用するリスナー・クラスに実装します。

サーブレット・コンテナは、HttpSessionActivationListenerメソッドのコールに対する入力として使用するために、HttpSessionEventクラスのインスタンスを作成します。 このクラスの詳細は、「HttpSessionListenerメソッド、HttpSessionEventクラス」を参照してください。

HttpSessionBindingListenerメソッド

HttpSessionBindingListenerインタフェースは、次のメソッドを指定します。このインタフェースは、セッションにバインドされるインスタンスを持つクラスに実装します。

サーブレット・コンテナは、HttpSessionBindingListenerメソッドのコールに対する入力として使用するために、HttpSessionBindingEventクラスのインスタンスを作成します。 このクラスの詳細は、「HttpSessionAttributeListenerメソッド、HttpSessionBindingEventクラス」を参照してください。

ServletRequestListenerメソッド、ServletRequestEventクラス

ServletRequestListenerインタフェースは、次のメソッドを指定します。このインタフェースは、リクエストのライフ・サイクル・イベントを追跡するために使用するリスナー・クラスに実装します。

サーブレット・コンテナは、ServletRequestListenerメソッドのコールに対して入力されるjavax.servlet.ServletRequestEventオブジェクトを作成します。ServletRequestEventクラスには、リスナーがコール可能な次のメソッドが含まれています。

ServletRequestAttributeListenerメソッド、ServletRequestAttributeEventクラス

ServletRequestAttributeListenerインタフェースは、次のメソッドを指定します。このインタフェースは、リクエストの属性イベントを追跡するために使用するリスナー・クラスに実装します。

サーブレット・コンテナは、ServletRequestAttributeListenerメソッドのコールに対して入力されるjavax.servlet.ServletRequestAttributeEventオブジェクトを作成します。ServletRequestAttributeEventクラスには、リスナーがコール可能な次のメソッドが含まれています。

イベント・リスナーの実装および構成

この項では、リスナーの実装および構成の基本手順を示します。 例の全体は、「セッションのライフ・サイクル・リスナーの例」を参照してください。

リスナーのコードの実装

リスナー・クラスは、「イベント・リスナー機能の概要」でまとめたイベントのカテゴリのいずれかまたはすべてに使用できます。1つのクラスによって、複数のリスナーを実装できます。次に、実装コードを示します。

リスナーの構成

各リスナー・クラスを構成するには、アプリケーションweb.xmlファイルの<listener>要素(<web-app>のサブ要素)とその<listener-class>サブ要素を使用します。

<web-app>
   <listener>
      <listener-class>SessionLifeCycleEventExample</listener-class>
   </listener>
...
   <servlet>
      <servlet-name>name</servlet-name>
      <servlet-class>class</servlet-class>
   </servlet>
...
   <servlet-mapping>
      <servlet-name>name</servlet-name>
      <url-pattern>path</url-pattern>
   </servlet-mapping>
...
</web-app>

リスナーは、特定のサーブレットには関連付けられません。アプリケーションの起動時に、各イベント・カテゴリについて、サーブレット・コンテナは、web.xmlで宣言された順序でリスナーを登録します。アプリケーションの実行時に、各カテゴリのイベント・リスナーは、該当するイベントが発生するたびに登録順に起動されます。リスナーは、アプリケーションの最後のリクエストが処理されるまで、アクティブ状態のままです。

ただし、アプリケーションのシャットダウン時は、宣言順序とは逆の順序でリスナーに通知され、サーブレット・コンテキスト・リスナーの前にリクエストおよびセッション・リスナーに通知されます。

初期ファイルに必要な物理ファイル

初期ファイルをサーブレットにディスパッチするためには、物理ファイルが必要です。 JSPページ/index.jspにマップする/index.htmlにマップするサーブレットを作成し、それを初期ファイルとして使用する場合は、web.xmlファイルに次のエントリを含める必要があります。

<servlet> 
   <servlet-name> index_jsp </servlet-name> 
   <jsp-file> /index.jsp </jsp-file> 
</servlet> 

<servlet-mapping> 
   <servlet-name>index_jsp</servlet-name> 
   <url-pattern>/index.html</url-pattern> 
</servlet-mapping> 

Webアプリケーションに、物理ファイル、/index.htmlがある場合にのみ、これは有効です。 ファイルの長さは0(ゼロ)でもかまいません。 ファイルが存在しさえすれば、このサーブレットは初期ファイルとしてロードされます。 ファイルが存在しない場合は、java.lang.StringIndexOutOfBoundsException例外がスローされます。

セッションのライフ・サイクル・リスナーの例

次に、セッションが作成または終了されるたびにOC4Jコンソールにメッセージを書き込むセッションのライフ・サイクル・イベント・リスナーの簡単な例を示します。この例には、次のコンポーネントのコードが含まれます。

JSP「ようこそ」ページの作成

次に、JSP「ようこそ」ページのindex.jspを示します。このページの「Create New Session」リンクをクリックすると、セッション作成サーブレットを起動できます。この例では、アプリケーションのコンテキスト・パスを/mylistenerとし、mysessioncreateがセッション作成サーブレットのサーブレット・パスとしてweb.xmlで構成されているものとします。

<%@page session="false" %>
<HTML>
<BODY>
<H2>OC4J Session Event Listener</H2>
<P>
This example demonstrates the use of a session event listener.
</P>
<P>
<a href="/mylistener/mysessioncreate">Create New Session</A><br><br>
</P>
<P>
Click the <b>Create</b> link above to start a new session.<br>
A session listener has been configured for this application.<br>
The servlet container will send an event to this listener when a new session is<br> 
created or destroyed. The output from the event listener will be visible in the<br>
console window from where OC4J was started.
</P>
</BODY>
</HTML>

セッション作成サーブレットの作成

このSessionCreateServletというサーブレットは、HTTPセッション・オブジェクトを作成し、作成されたセッションに関する情報を表示します。SessionDestroyServletを起動する「Destroy Session」リンクをクリックすると、セッションを終了できます。この例では、アプリケーションのコンテキスト・パスを/mylistenerとし、mysessiondestroyがセッション無効化サーブレットのサーブレット・パスとしてweb.xmlで構成されているものとします。

import java.io.*;
import java.util.Enumeration;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class SessionCreateServlet extends HttpServlet { 
 
   public void doGet (HttpServletRequest req, HttpServletResponse res)
          throws ServletException, IOException
   {
      // Get the session object.
      HttpSession session = req.getSession(true);
 
      // Set content type for the response.
      res.setContentType("text/html");
 
      // Then write the data of the response.
      PrintWriter out = res.getWriter();
 
      out.println("<HTML><BODY>");
      out.println("<A HREF=\"/mylistener/mysessiondestroy\">Destroy Session</A>");
      out.println("<h2>Session Created</h2>");
      out.println("Also check the OC4J console.");
      out.println("<h3>Session Data:</h3>");
      out.println("New Session: " + session.isNew());
      out.println("<br>Session ID: " + session.getId());
      out.println("<br>Creation Time: " + new Date(session.getCreationTime()));
      out.println("</BODY></HTML>");
  
   }
}

セッション無効化サーブレットの作成

このSessionDestroyServletというサーブレットは、HTTPセッション・オブジェクトを破棄します。「Reload Welcome Page」リンクをクリックすると、JSP「ようこそ」ページに戻って新しいセッションを作成できます。この例では、アプリケーションのコンテキスト・パスを/mylistenerとします。

import java.io.*;
import java.util.Enumeration;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class SessionDestroyServlet extends HttpServlet { 
 
   public void doGet (HttpServletRequest req, HttpServletResponse res)
          throws ServletException, IOException
   {
      // Get the session object.
      HttpSession session = req.getSession(true);
 
      // Invalidate the session.
      session.invalidate(); 
 
      // Set content type for response.
      res.setContentType("text/html");
 
      // Then write the data of the response.
      PrintWriter out = res.getWriter();
 
      out.println("<HTML><BODY>");
      out.println("<A HREF=\"/mylistener/index.jsp\">Reload Welcome Page</A>");
      out.println("<h2>Session Destroyed</h2>");
      out.println("Also check the OC4J console.");
      out.println("</BODY></HTML>");
      out.close();
   }
}

セッションのライフ・サイクル・リスナーのコードの作成

この項では、セッション・ライフ・サイクル・リスナー・クラスのSessionLifeCycleEventExampleを示します。このクラスは、HttpSessionListenerインタフェースを実装します。このクラスのsessionCreated()メソッドは、HTTPセッションが作成されるたびにサーブレット・コンテナによってコールされます。このコールは、JSP「ようこそ」ページの「Create New Session」をクリックすると実行されます。sessionCreated()のコール時に、新規セッションのIDを示すCREATEDメッセージがOC4Jコンソールに書き込まれます。

sessionDestroyed()メソッドは、HTTPセッションが破棄されるたびにサーブレット・コンテナによってコールされます。このコールは、セッション作成サーブレットで「Destroy Session」をクリックすると実行されます。sessionDestroyed()のコール時に、終了セッションのIDを示すDESTROYEDメッセージがOC4Jコンソールに出力されます。

(このクラスは、ServletContextListenerインタフェースも実装し、contextInitialized()およびcontextDestroyed()メソッドも持ちますが、これらの機能は、この例では使用されません。)

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

public class SessionLifeCycleEventExample 
       implements ServletContextListener, HttpSessionListener
{
   ServletContext servletContext;
 
   /* Methods for the ServletContextListener */
   public void contextInitialized(ServletContextEvent sce)
   {
      servletContext = sce.getServletContext();
   }
 
   public void contextDestroyed(ServletContextEvent sce)
   {
   }
 
   /* Methods for the HttpSessionListener */
   public void sessionCreated(HttpSessionEvent hse)
   {
      log("CREATED",hse);
   }
 
   public void sessionDestroyed(HttpSessionEvent hse)
   {
      log("DESTROYED",hse);
   }
 
   protected void log(String msg, HttpSessionEvent hse)
   {
      String _ID = hse.getSession().getId();
      log("SessionID: " + _ID + "   " + msg);
   }
 
   protected void log(String msg)
   {
      System.out.println(getClass().getName() + "  " + msg);
   }
}

セッションのライフ・サイクル・リスナーの例の構成

サーブレットとイベント・リスナーは、web.xmlファイルで宣言されます。その結果、アプリケーションの起動時にSessionLifeCycleEventExampleがインスタンス化され、登録されます。このため、セッションのライフ・サイクル・イベントの発生時に、SessionLifeCycleEventExampleメソッドが、必要に応じて、サーブレット・コンテナによって自動的にコールされます(サーブレット・コンテキストのライフ・サイクル・イベントの発生時にもコールされますが、この例には関係ありません)。次に、web.xmlのエントリを示します。

<?xml version="1.0" ?> 
<!DOCTYPE web-app (doctype...)> 
<web-app> 
   <listener> 
      <listener-class>SessionLifeCycleEventExample</listener-class> 
   </listener> 
   <servlet> 
      <servlet-name>sessioncreate</servlet-name> 
      <servlet-class>SessionCreateServlet</servlet-class> 
   </servlet> 
   <servlet> 
      <servlet-name>sessiondestroy</servlet-name> 
      <servlet-class>SessionDestroyServlet</servlet-class> 
   </servlet> 
   <servlet-mapping> 
      <servlet-name>sessioncreate</servlet-name> 
      <url-pattern>mysessioncreate</url-pattern> 
   </servlet-mapping> 
   <servlet-mapping> 
      <servlet-name>sessiondestroy</servlet-name> 
      <url-pattern>mysessiondestroy</url-pattern> 
   </servlet-mapping> 
   <welcome-file-list> 
      <welcome-file>index.jsp</welcome-file> 
   </welcome-file-list> 
</web-app>

セッションのライフ・サイクル・リスナーの例のパッケージ化

この例のWARファイル(sessionlistener.war)は、次のコンテンツと構造を持ちます。

index.jsp
META-INF/Manifest.mf
WEB-INF/web.xml
WEB-INF/classes/SessionCreateServlet.class
WEB-INF/classes/SessionCreateServlet.java
WEB-INF/classes/SessionDestroyServlet.class
WEB-INF/classes/SessionDestroyServlet.java
WEB-INF/classes/SessionLifeCycleEventExample.class
WEB-INF/classes/SessionLifeCycleEventExample.java

また、EARファイルは、次のとおりです。

sessionlistener.war
META-INF/application.xml
META-INF/Manifest.mf

Manifest.mfファイルは、JARユーティリティにより自動的に作成されます。)

セッションのライフ・サイクル・リスナーの例の起動

この例では、application.xmlがコンテンツ・パスの/mylistenersessionlistener.warにマップするものとします。この場合、デプロイ後に、次のように、JSP「ようこそ」ページを起動します。

http://host:port/mylistener/index.jsp

次に、「ようこそ」ページの出力を示します。


画像の説明

「Create New Session」をクリックすると、セッション作成サーブレットが起動します。テスト実行では、これにより、次のように出力されます。


画像の説明

また、OC4Jコンソールには、次のようにレポートされます。

04/05/13 15:56:25 SessionLifeCycleEventExample   
Session ID: 8223afa422b84b94235252164cb9a7ad84089f1abe70     CREATED

「Destroy Session」をクリックすると、セッション終了サーブレットが起動します。これにより、次のように出力されます。


画像の説明

また、テスト実行では、OC4Jコンソールに、次のようにレポートされます。

04/05/13 15:58:08 SessionLifeCycleEventExample   
Session ID: 8223afa422b84b94235252164cb9a7ad84089f1abe70     DESTROYED

「Reload Welcome Page」をクリックすると、JSP「ようこそ」ページに戻ります。このページでは、別のセッションを作成できます。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引