Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Servlet・JSP > Servlet −8.リスナー(ServletContext)
更新日:2011/7/31
Servlet−8.リスナー(ServletContext)
リスナーとは、Webアプリケーションに何らかのイベントが発生した際にそれをプログラムに通知する機能です。この機能により、イベントの発生と連動したプログラムの実行を行うことができるようになります。ここでは、ServletContextオブジェクト関連のイベントが発生した際に呼び出されるリスナーについて解説します。
概要
ServletContext関連のリスナーには、ServletContextListenerインタフェースとServletContextAttributeListenerインタフェースの2つがあります。

ServletContextListenerインタフェース
サーブレットコンテキスト(Webアプリケーション)が起動するときや破棄されるときに呼び出されます。そのため、Servletプログラムの初期化処理をしたい場合や、終了処理をしたい場合に使用します。

ServletContextAttributeListenerインタフェース
applicationスコープを持つデータが追加・置換・削除されたときに呼び出されます。該当のデータに変更があったときにその変更をログに出力したい場合などに使用します。
ServletContextListenerインタフェース
ServletContextListenerインタフェースには以下のメソッドが定義されています。
戻り型
メソッド
説明
void
contextInitialized(ServletContextEvent)
サーブレットコンテキスト(Webアプリケーション)が起動するときに呼び出されるメソッドです。
void
contextDestroyed(ServletContextEvent)
サーブレットコンテキスト(Webアプリケーション)が破棄されるときに呼び出されるメソッドです。
メソッドの引数に指定されているServletContextEventクラスには以下のメソッドが定義されています。
戻り型
メソッド
説明
ServletContext
getServletContext( )
対象のServletContextオブジェクトを返します。
ServletContextAttributeListenerインタフェース
ServletContextAttributeListenerインタフェースには以下のメソッドが定義されています。
戻り型
メソッド
説明
void
attributeAdded(ServletContextAttributeEvent)
applicationスコープを持つデータが追加されたときに呼び出されるメソッドです。
void
attributeReplaced(ServletContextAttributeEvent)
applicationスコープを持つデータが置換されたときに呼び出されるメソッドです。
void
attributeRemoved(ServletContextAttributeEvent)
applicationスコープを持つデータが削除されたときに呼び出されるメソッドです。
メソッドの引数に指定されているServletContextAttributeEventクラスには以下のメソッドが定義されています。
戻り型
メソッド
説明
ServletContext
getServletContext( )
対象のServletContextオブジェクトを返します。
String
getName( )
追加、置換、削除されたデータの名前を返します。
Object
getValue( )
追加、置換、削除されたデータの値を返します。
web.xmlの設定
リスナーを使用する場合は、リスナーインタフェースを実装したリスナークラスをweb.xmlに指定する必要があります。リスナーの設定は<listener>タグで行います。<listener>タグは<web-app>タグ内に記載します。
要素
内容
要素数
description
リスナーの説明を記載します。
0以上
display-name
GUIツールで表示されるリスナーの名前を記載します。
0以上
icon
GUIツールで表示される画像を指定します。
0以上
listener-class
リスナーインタフェースを実装したServletクラスを記載します。
1
使用例
ServletContextAttributeListenerインタフェースの使用例について解説します。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にアクセスした後、ログが生成されていることが確認できます。リスナークラスは通常のServletプログラムと同様にコンテキストルート\WEB-INF\classesディレクトリ配下に配置します。Servletプログラムの実行方法に関しては、Javaの道:Tomcat(プログラム配置・実行)を参照してください。
Javaの道_リスナー
---------------------------------
---------------------------------

※ログが生成されていることが確認できます。
2004-09-20 22:05:03 StandardContext[/serTest]name Added



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