ServletContext イベントのリスン

ServletContext には、Web アプリケーションですべてのサーブレットが共有するリソースにユーザーがアクセスできるようにする API があります。ServletContext オブジェクトには次の 2 つのイベントリスナインターフェイスがあります。

JRun は ServletContextEvent オブジェクトを ServletContext に渡し、
ServletContextAttributeEvent オブジェクトを ServletContextAttribute イベントに渡します。JRun は、イベントオブジェクトを介して ServletContext および ServletContext の属性にアクセスできます。

ServletContext イベントが発生すると、リスナインターフェイスが実装しているメソッドをトリガーできます。次の表に、ServletContext インターフェイスのメソッドと、JRun にこれらのメソッドを呼び出させるイベントを示します。
メソッド
このメソッドに通知するイベント
ServletContextListener インターフェイス
contextInitialized
JRun が ServletContext を作成する
JRun サーバを起動する
JRun サーバを再起動する
contextDestroyed
JRun が ServletContext を廃棄する
JRun サーバを停止する
JRun サーバを再起動する
ServletContextAttributeListener インターフェイス
attributeAdded
ServletContext オブジェクトに属性を追加する
JRun サーバを起動する
JRun サーバを再起動する
context.setAttribute を呼び出すことによって
属性を追加する
attributeReplaced
ServletContext オブジェクトの属性の値を変更する
context.setAttribute を呼び出すことによって
属性を変更する
attributeRemoved
ServletContext 属性を削除する
JRun サーバを停止または再起動する
context.removeAttribute を呼び出すことによって属性を削除する

リスナを使用して、データベース接続のロギングや作成などのタスクを実行する
ServletContext リスナイベントメソッドに開始または終了コードを入れることができます。

ServletContextListener について

JRun は、Web アプリケーションがリクエストを受け取る準備が整い、新規 ServletContext が作成されたとき、および Web アプリケーションがコンテナから削除され、ServletContext が廃棄されたときに ServletContextListener に通知します。これらのイベントは通常、JRun サーバの起動、停止、および再起動時に発生します。

ServletContextListener サーブレットには次の 2 つのメソッドがあります。

ServletContextEvent オブジェクトには次の 1 つのメソッドがあります。

getServletContext()

ServletContextAttributeListener について

ServletContext の属性には、Web アプリケーション内のすべてのサーブレットからアクセス可能です。ServletContext の属性は、RequestDispatcher を使用して頻繁に関連付けられます。

JRun は、ServletContext の属性が追加または削除されるか、または属性の値が変更されると ServletContextAttributeListener に通知します。

このリスナは 3 つのメソッドから構成されています。

ServletContextAttributeEvent オブジェクトは ServletContextEvent オブジェクトから getServletContext メソッドを継承します。ServletContext の属性にアクセスできるメソッドが他に 2 つあります。

ServletContextListener のロギング例

次の例は、ServletContextEvent オブジェクトで使用可能な唯一のメソッド
getServletContext の使用方法を示しています。このメソッドを使用すると、
ServletContext オブジェクトを取得し、ServletContext のすべてのメソッドにアクセスできます。

この単純な ServletContext イベントリスナは ServletContextListener インターフェイスのメソッドを実装します。これらのいずれかのイベントが発生すると、ログファイルに行が書き込まれます。

public final class ContextLoggingListener implements 
ServletContextListener {
 public void contextInitialized(ServletContextEvent event) {
  event.getServletContext().log("ServletContext initialized");
 }
 public void contextDestroyed(ServletContextEvent event) {
  event.getServletContext().log("ServletContext destroyed");
 }
}

このイベントリスナは web.xml ファイルで定義されます。たとえば、次のコードは
ContextLoggingListener を定義します。

<listener>
 <listener-class>jrunsamples.events.ContextLoggingListener</
listener-class>
</listener>

ServletContextListener へのファイルアクセス例

この例では、ServletContext オブジェクトから初期化パラメータを取得し、ServletContext に別の属性を設定します。

...
public final class ContextLoggingListener implements 
ServletContextListener {
 public void contextInitialized(ServletContextEvent event) {
  private static final char c = File.separatorChar;
  try {
   System.out.println("ServletContext initialized");
   File baseDir = 
(File) event.getServletContext().getInitParameter("baseDir");
   String fullpath = baseDir.getAbsolutePath() + c + "temp.txt";
   event.getServletContext().setAttribute("fullpath", fullpath);
   File f = new File(fullpath);
   if (!f.exists()) {
    ... // ファイル操作ロジック
   } else {
    ... // 
   }
  catch (Exception e) {
   e.printStackTrace();
  }
 }
...

ServletContextAttributeListener の例

次の例では、ServletContextAttributeListener のメソッドを実装します。
これらのいずれかのイベントが発生すると、標準出力に行が出力されます。この例では、
ServletContextAttributeEvent オブジェクトに用意されている便利な getValue メソッドの使用方法も示しています。

public final class ContextLoggingAttributeListener implements 
ServletContextAttributeListener {
 public void attributeAdded(ServletContextAttributeEvent event) {
  System.out.println("ServletContext attribute added");
  Enumeration enum = event.getServletContext().getAttributeNames();
  while (enum.hasMoreElements()) {
  String attrname = (String)enum.nextElement();
  System.out.println(attrname + "=" + event.getValue(attrname));
 }
 public void attributeReplaced(ServletContextAttributeEvent event) {
  System.out.println("ServletContext attribute replaced");
 }
 public void attributeRemoved(ServletContextAttributeEvent event) {
  System.out.println("ServletContext attribute removed");
 }
}