| Oracle Containers for J2EE サーブレット開発者ガイド 10g(10.1.3.1.0) B31859-01 |
|
サーブレット仕様には、イベント・リスナーを使用してWebアプリケーションの主要イベントを追跡する機能が含まれています(イベント・リスナーの概要は、「サーブレット通知にイベント・リスナーを使用する場面」を参照)。リスナーを使用すると、イベントの状態に基づいた自動処理やより効率的なリソース管理を実行できます。リスナーは、リクエスト・イベント、セッション・イベントおよびサーブレット・コンテキスト・イベントについて実装できます。これについて、次の項で説明します。
次の8つのイベント・リスナー・カテゴリがあります。
これらのイベント・カテゴリごとに1つ以上のイベント・リスナー・クラスを作成できます。また、1つのリスナー・クラスが、複数のイベント・カテゴリを監視できます。
イベント・リスナー・クラスを作成するには、javax.servletまたはjavax.servlet.httpパッケージの適切なインタフェースを1つ以上実装します。表5-1は、カテゴリと関連するインタフェースをまとめたものです。
リスナーは、web.xmlファイルの<listener>要素(<web-app>要素のサブ要素)を使用して構成します。 「リスナーの構成」を参照してください。
アプリケーションの起動後およびアプリケーションが最初のリクエストを処理する前に、サーブレット・コンテナは、web.xmlで宣言されている各リスナー・クラスのインスタンスを作成および登録します。各イベント・カテゴリのリスナーは、宣言された順序で登録されます。その結果、アプリケーションの実行時に、各カテゴリのイベント・リスナーは、登録順に起動されます。すべてのリスナーは、アプリケーションの最後のリクエストが処理されるまで、アクティブ状態のままです。
この項では、表5-1にまとめたインタフェースのメソッドについて説明します。この項で説明する各メソッドは、該当するイベントが発生したときにサーブレット・コンテナによってコールされます。これらのメソッドは、様々なタイプのイベント・オブジェクトを入力として取得するため、各イベント・クラスとそのメソッドについても説明します。
ServletContextListenerインタフェースは、次のメソッドを指定します。このインタフェースは、サーブレット・コンテキストのライフ・サイクル・イベントを追跡するために使用するクラスに実装します。
void contextInitialized(ServletContextEvent sce)サーブレット・コンテナは、サーブレット・コンテキストの作成が完了し、アプリケーションでリクエストを処理できるようになると、このメソッドをコールします。
void contextDestroyed(ServletContextEvent sce)サーブレット・コンテナは、アプリケーションが停止される直前に、このメソッドをコールします。
サーブレット・コンテナは、ServletContextListenerメソッドのコールに対して入力されるjavax.servlet.ServletContextEventオブジェクトを作成します。ServletContextEventクラスには、リスナーがコール可能な次のメソッドが含まれています。
ServletContext getServletContext()このメソッドを使用して、作成済または停止対象のサーブレット・コンテキス・オブジェクトを取得します。このオブジェクトから必要な情報を取得できます。javax.servlet.ServletContextインタフェースの詳細は、「サーブレット・コンテキスト: アプリケーション・コンテナ」を参照してください。
ServletContextAttributeListenerインタフェースは、次のメソッドを指定します。このインタフェースは、サーブレット・コンテキストの属性イベントを追跡するために使用するクラスに実装します。
void attributeAdded(ServletContextAttributeEvent scae)サーブレット・コンテナは、属性がサーブレット・コンテキストに追加されると、このメソッドをコールします。
void attributeRemoved(ServletContextAttributeEvent scae)サーブレット・コンテナは、属性がサーブレット・コンテキストから削除されると、このメソッドをコールします。
void attributeReplaced(ServletContextAttributeEvent scae)サーブレット・コンテナは、属性がサーブレット・コンテキストで置換される(値が変化する)と、このメソッドをコールします。
サーブレット・コンテナは、ServletContextAttributeListenerメソッドのコールに対して入力されるjavax.servlet.ServletContextAttributeEventオブジェクトを作成します。ServletContextAttributeEventクラスには、リスナーがコール可能な次のメソッドが含まれています。
String getName()このメソッドを使用して、追加、削除または置換された属性の名前を取得します。
Object getValue()このメソッドを使用して、追加、削除または置換された属性の値を取得します。置換された属性の場合、このメソッドは置換後の値ではなく、置換前の値を戻します。
HttpSessionListenerインタフェースは、次のメソッドを指定します。このインタフェースは、セッションのライフ・サイクル・イベントを追跡するために使用するリスナー・クラスに実装します。
void sessionCreated(HttpSessionEvent hse)サーブレット・コンテナは、セッションが作成されると、このメソッドをコールします。
void sessionDestroyed(HttpSessionEvent hse)サーブレット・コンテナは、セッションが終了する直前に、このメソッドをコールします。
サーブレット・コンテナは、HttpSessionListenerメソッドのコールに対して入力されるjavax.servlet.http.HttpSessionEventオブジェクトを作成します。HttpSessionEventクラスには、リスナーがコール可能な次のメソッドが含まれています。
HttpSessionAttributeListenerインタフェースは、次のメソッドを指定します。このインタフェースは、セッションの属性イベントを追跡するために使用するリスナー・クラスに実装します。
void attributeAdded(HttpSessionBindingEvent hsbe)サーブレット・コンテナは、属性がセッションに追加されると、このメソッドをコールします。
void attributeRemoved(HttpSessionBindingEvent hsbe)サーブレット・コンテナは、属性がセッションから削除されると、このメソッドをコールします。
void attributeReplaced(HttpSessionBindingEvent hsbe)サーブレット・コンテナは、属性がセッションで置換される(値が変化する)と、このメソッドをコールします。
サーブレット・コンテナは、HttpSessionAttributeListenerメソッドのコールに対して入力されるjavax.servlet.http.HttpSessionBindingEventオブジェクトを作成します。HttpSessionBindingEventクラスには、リスナーがコール可能な次のメソッドが含まれています。
String getName()このメソッドを使用して、追加、削除または置換された属性の名前を取得します。
Object getValue()このメソッドを使用して、追加、削除または置換された属性の値を取得します。置換された属性の場合、このメソッドは置換後の値ではなく、置換前の値を戻します。
HttpSession getSession()このメソッドを使用して、属性の変更が発生したセッション・オブジェクトを取得します。
HttpSessionActivationListenerインタフェースは、次のメソッドを指定します。このインタフェースは、セッションの移行(アクティブ化または非アクティブ化)イベントを追跡するために使用するリスナー・クラスに実装します。
void sessionDidActivate(HttpSessionEvent hse)サーブレット・コンテナは、セッションがアクティブ化されると、このメソッドをコールします。
void sessionWillPassivate(HttpSessionEvent hse)サーブレット・コンテナは、セッションが非アクティブ化される直前に、このメソッドをコールします。
サーブレット・コンテナは、HttpSessionActivationListenerメソッドのコールに対する入力として使用するために、HttpSessionEventクラスのインスタンスを作成します。 このクラスの詳細は、「HttpSessionListenerメソッド、HttpSessionEventクラス」を参照してください。
HttpSessionBindingListenerインタフェースは、次のメソッドを指定します。このインタフェースは、セッションにバインドされるインスタンスを持つクラスに実装します。
void valueBound(HttpSessionBindingEvent hsbe)サーブレット・コンテナは、(HttpSessionBindingListenerを実装する)オブジェクトが(識別される)セッションにバインドされると、このメソッドをコールします。
void valueUnbound(HttpSessionBindingEvent hsbe)サーブレット・コンテナは、オブジェクトが(識別される)セッションからアンバインドされると、このメソッドをコールします。オブジェクトは、明示的にアンバインドされる場合や、セッションの無効化またはタイムアウトの結果としてアンバインドされる場合があります。
サーブレット・コンテナは、HttpSessionBindingListenerメソッドのコールに対する入力として使用するために、HttpSessionBindingEventクラスのインスタンスを作成します。 このクラスの詳細は、「HttpSessionAttributeListenerメソッド、HttpSessionBindingEventクラス」を参照してください。
ServletRequestListenerインタフェースは、次のメソッドを指定します。このインタフェースは、リクエストのライフ・サイクル・イベントを追跡するために使用するリスナー・クラスに実装します。
void requestInitialized(ServletRequestEvent sre)サーブレット・コンテナは、リクエストがWebアプリケーションのスコープに入る直前に、このメソッドをコールします。
void requestDestroyed(ServletRequestEvent sre)サーブレット・コンテナは、リクエストがWebアプリケーションのスコープから出る直前に、このメソッドをコールします。
サーブレット・コンテナは、ServletRequestListenerメソッドのコールに対して入力されるjavax.servlet.ServletRequestEventオブジェクトを作成します。ServletRequestEventクラスには、リスナーがコール可能な次のメソッドが含まれています。
ServletRequest getServletRequest()このメソッドを使用して、ステータスが変化したサーブレット・リクエストを取得します。
ServletContext getServletContext()このメソッドを使用して、Webアプリケーションのサーブレット・コンテキストを取得します。
ServletRequestAttributeListenerインタフェースは、次のメソッドを指定します。このインタフェースは、リクエストの属性イベントを追跡するために使用するリスナー・クラスに実装します。
void attributeAdded(ServletRequestAttributeEvent srae)サーブレット・コンテナは、属性がリクエストに追加されると、このメソッドをコールします。
void attributeRemoved(ServletRequestAttributeEvent srae)サーブレット・コンテナは、属性がリクエストから削除されると、このメソッドをコールします。
void attributeReplaced(ServletRequestAttributeEvent srae)サーブレット・コンテナは、属性がリクエストで置換される(値が変化する)と、このメソッドをコールします。
サーブレット・コンテナは、ServletRequestAttributeListenerメソッドのコールに対して入力されるjavax.servlet.ServletRequestAttributeEventオブジェクトを作成します。ServletRequestAttributeEventクラスには、リスナーがコール可能な次のメソッドが含まれています。
String getName()このメソッドを使用して、追加、削除または置換された属性の名前を取得します。
Object getValue()このメソッドを使用して、追加、削除または置換された属性の値を取得します。置換された属性の場合、このメソッドは置換後の値ではなく、置換前の値を戻します。
この項では、リスナーの実装および構成の基本手順を示します。 例の全体は、「セッションのライフ・サイクル・リスナーの例」を参照してください。
リスナー・クラスは、「イベント・リスナー機能の概要」でまとめたイベントのカテゴリのいずれかまたはすべてに使用できます。1つのクラスによって、複数のリスナーを実装できます。次に、実装コードを示します。
ServletContextListenerインタフェースを実装し、必要に応じて、メソッドのcontextInitialized()(アプリケーションの起動時の処理用)およびcontextDestroyed()(アプリケーションの停止時の処理用)のコードを作成します。
ServletContextAttributeListenerインタフェースを実装し、必要に応じて、メソッドのattributeAdded()(属性の追加時の処理用)、attributeRemoved()(属性の削除時の処理用)およびattributeReplaced()(属性値の変更時の処理用)のコードを作成します。
HttpSessionListenerインタフェースを実装し、必要に応じて、メソッドのsessionCreated()(セッション作成時の処理用)およびsessionDestroyed()(セッション無効化時の処理用)のコードを作成します。 簡単な例は、「セッションのライフ・サイクル・リスナーのコードの作成」を参照してください。
HttpSessionAttributeListenerインタフェースを実装し、必要に応じて、メソッドのattributeAdded()、attributeRemoved()およびattributeReplaced()のコードを作成します。
HttpSessionActivationListenerインタフェースを実装し、必要に応じて、メソッドのsessionDidActivate()(セッションのアクティブ化時の処理用)およびsessionWillPassivate()(セッションの非アクティブ化時の処理用)のコードを作成します。
HttpSessionBindingListenerインタフェースを実装し、必要に応じて、メソッドのvalueBound()(セッションへのオブジェクトのバインド時の処理用)またはvalueUnbound()(セッションからのオブジェクトのアンバインド時の処理用)のコードを作成します。
ServletRequestListenerインタフェースを実装し、必要に応じて、メソッドのrequestInitialized()(リクエストがスコープに入ったときの処理用)およびrequestDestroyed()(リクエストがスコープから出たときの処理用)のコードを作成します。
ServletRequestAttributeListenerインタフェースを実装し、必要に応じて、メソッドのattributeAdded()、attributeRemoved()およびattributeReplaced()のコードを作成します。各リスナー・クラスを構成するには、アプリケーション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コンソールにメッセージを書き込むセッションのライフ・サイクル・イベント・リスナーの簡単な例を示します。この例には、次のコンポーネントのコードが含まれます。
index.jsp: アプリケーションの「ようこそ」ページ。このページには、SessionCreateServletを起動してHTTPセッションを作成するためのリンクがあります。
SessionCreateServlet: このサーブレットは、HTTPセッションを作成します。また、セッションを終了するためのSessionDestroyServletへのリンクを持ちます。
SessionDestroyServlet: このサーブレットは、セッションを終了します。また、「ようこそ」ページに戻るためのリンクを持ちます。
SessionLifeCycleEventExample: イベント・リスナー・クラス。HttpSessionListenerインタフェースと、セッションの作成または終了時にコンソール・メッセージを書き込むsessionCreated()およびsessionDestroyed()メソッドのコードを実装します。
次に、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がコンテンツ・パスの/mylistenerをsessionlistener.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「ようこそ」ページに戻ります。このページでは、別のセッションを作成できます。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|