Listener of Events defed @ ServeltContext

■リスナー
Webアプリに何らかのイベントが発生した際にそれをプログラムに通知する機能
→イベントの発生と連動したプログラムを実行できる。

==================================================
■ServletContextオブジェクト関連のイベント用のリスナー
―ServletContextListener
―ServletContextAttributeListener

■ServletContextListener
呼び出されるタイミング:
 サーブレットコンテキスト(Webアプリ)が起動する時
 (Servletプログラムの初期化処理)
 サーブレットコンテキスト(Webアプリ)を破棄するとき
 (Servletプログラムの終了処理)

■ServletContextAttributeListener
呼び出されるタイミング:
 applicationスコープを持つデータが追加、置換、削除された時
 (該当データに変更があった際のログ出力処理等)

■サンプル
applicationスコープを持つデータの登録時にリスナークラスが呼び出されログを生成

【checkListenerServlet.java】applicationスコープのデータ登録を監視するリスナークラス

import javax.servlet.*;

//(1)ServletContextAttributeListenerインタフェースを実装
public class checkListenerServlet
implements ServletContextAttributeListener {
//(2)attributeAddedメソッドを定義
public void attributeAdded(ServletContextAttributeEvent scae) {
//(3)getServletContextメソッドを使用して
// ServletContextオブジェクトを取得
ServletContext sc = scae.getServletContext();
//(4)getNameメソッドで登録されたデータ名を取得してログに生成
sc.log(scae.getName() + " Added");
}

public void attributeReplaced(ServletContextAttributeEvent scae) {}

public void attributeRemoved(ServletContextAttributeEvent scae) {}
}

【addDataServlet.java】applicationスコープを持つデータを登録するプログラム

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

public class addDataServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
//(1)getServletContextメソッドを使用して
// ServletContextオブジェクトを取得
ServletContext sc = getServletContext();

//(2)applicationスコープを持つ、データ"name"を登録
sc.setAttribute("name", "java");
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("applicationスコープのデータnameを登録");
out.println("<'/BODY><'/HTML>");
}
}

【web.xml】リスナークラス(checkListenerServlet.java)とServletクラス(addDataServlet.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>checkListenerServlet<'/listener-class>
<'/listener>
<'servlet>
<'servlet-name>addDataServlet<'/servlet-name>
<'servlet-class>addDataServlet<'/servlet-class>
<'/servlet>
<'servlet-mapping>
<'servlet-name>addDataServlet<'/servlet-name>
<'url-pattern>/addDataServlet<'/url-pattern>
<'/servlet-mapping>
<'/web-app>

【実行結果】Servlet プログラムaddDataServletにアクセスした後、ログが生成されているのが確認できる。
リスナークラスは他と同様に、コンテキストルート\WEB-INF\classesディレクトリ配下に配置。
ログ↓
2004-09-20 22:05:03 StandardContext[/serTest]name Added


==================================================
■HttpSessionオブジェクト関連のイベント用のリスナー
―HttpSessionListener
―HttpSessionAttributeListener
―HttpSessionBindingListener
―HttpSessionActivationListener

■HttpSessionListener
呼び出されるタイミング:
 セッションが作成される時
 セッションが破棄される時
 (セッション数の把握、セッション作成時の初期化処理)

■HttpSessionAttributeListener
呼び出されるタイミング:
 sessionスコープを持つデータが追加、置換、削除された時
 (該当データに変更があった際のログ出力処理等)

■HttpSessionBindingListener
呼び出されるタイミング:
 このインタフェースを実装したクラスのオブジェクトがセッションに追加、削除された時
 ※このインタフェースを実装したクラスのオブジェクトのみがリスナーの対象となる。

■HttpSessionActivationListener
呼び出されるタイミング:
 分散環境やセッションを永続的に保持するコンテナ等で、セッションの活性化・非活性化された時

■サンプル
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にアクセスした後、ログにカウントされたセッション数が記載されてるのが確認できる。
※リスナークラスは他と同様に、コンテキストルート\WEB-INF\classesディレクトリ配下に配置。
ログ↓
2004-09-21 23:33:51 StandardContext[/serTest]Now Session Count : 1
2004-09-21 23:34:53 StandardContext[/serTest]Now Session Count : 2

==================================================
■リスナーの使用するには
リスナーインタフェースを実装したリスナークラスをweb.xmlに設定する。
リスナー設定用のタグ:
 ・description/リスナーの説明
 ・listener-class/リスナーインタフェースを実装したServletクラス(必須)

ref:
Javaの道
http://www.javaroad.jp/servletjsp/sj_servlet8.htm
http://www.javaroad.jp/servletjsp/sj_servlet9.htm
techscore
http://www.techscore.com/tech/J2EE/Servlet/7.html

2008-02-26 22:32 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud