Javaに関する様々な情報をご紹介します。

8リスナー(ServletContext)

Javaに関する様々な情報をご紹介します。

リスナー(ServletContext)

リスナーとは、Webアプリケーションに何らかのイベントが発生した際にそれをプログラムに通知する機能です。この機能により、イベントの発生と連動したプログラムの実行を行うことができるようになります。ここでは、ServletContextオブジェクト関連のイベントが発生した際に呼び出されるリスナーについて解説します。

概要

ServletContext関連のリスナーには、ServletContextListenerインタフェースとServletContextAttributeListenerインタフェースの2つがあります。

ServletContextListenerインタフェース
サーブレットコンテキスト(Webアプリケーション)が起動するときや破棄されるときに呼び出されます。そのため、Servletプログラムの初期化処理をしたい場合や、終了処理をしたい場合に使用します。
ServletContextAttributeListenerインタフェース
applicationスコープを持つデータが追加・置換・削除されたときに呼び出されます。該当のデータに変更があったときにその変更をログに出力したい場合などに使用します。

ServletContextListenerインタフェース

ServletContextListenerインタフェースには以下のメソッドが定義されています。

戻り型 メソッド 説明
void context
Initialized(
ServletCon
textEvent)
サーブレットコンテキスト(Webアプリケーション)が起動するときに呼び出されるメソッドです。
void context
Destroyed(
ServletCon
textEvent)
サーブレットコンテキスト(Webアプリケーション)が破棄されるときに呼び出されるメソッドです。

メソッドの引数に指定されているServletContextEventクラスには以下のメソッドが定義されています。

戻り型 メソッド 説明
Servlet
Context
getServlet
Context( )
対象のServletContextオブジェクトを返します。

ServletContextAttributeListenerインタフェース

ServletContextAttributeListenerインタフェースには以下のメソッドが定義されています。

戻り型 メソッド 説明
void attribute
Added(
ServletContext
AttributeEvent)
applicationスコープを持つデータが追加されたときに呼び出されるメソッドです。
void attribute
Replaced(
ServletContext
AttributeEvent)
applicationスコープを持つデータが置換されたときに呼び出されるメソッドです。
void attribute
Removed(
ServletContext
AttributeEvent)
applicationスコープを持つデータが削除されたときに呼び出されるメソッドです。

メソッドの引数に指定されているServletContextAttributeEventクラスには以下のメソッドが定義されています。

戻り型 メソッド 説明
Servlet
Context
getServlet
Context( )
対象の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

8リスナー(ServletContext)