―Servlet/JSPリファレンス―

@ITハイブックス編
2003/11/13
Javaプログラミング
ワンポイントレクチャーについて

  セッションに関連するオブジェクトへの通知

   ワンポイントQuestion

 あるオブジェクトが、それ自身がセッションオブジェクトに追加されたり、また、削除されたりしたときに通知を受けるようにしたいと考えています。

 その場合、どのインターフェイスをそのオブジェクトに実装すればよいか、選択肢より選んでください。(単一選択)

A HttpSessionBindingListener
B HttpSessionActivationListener
C ServletContextListener
D HttpServletResponseBindingListener
E HttpServletResponseListener

   解説

 セッションオブジェクトに追加させるオブジェクトには、セッションオブジェクトとの関係に関連する次のような特定のイベントを通知することができます。

 オブジェクトがセッションオブジェクトへ追加される、もしくはセッションオブジェクトから削除されるときは、この通知を受け取る際に、オブジェクトにjavax.http.HttpSessionBindingListenerインターフェイスを実装する必要があります。

 JVM間での移動が発生したときや、外部記憶領域へのデータ保存や復元を行うときに、セッションオブジェクトは活性化(アクティブ)、または非活性化(パッシブ)します。この通知を受け取るには、オブジェクトにjavax.http.HttpSessionActivationListenerインターフェイスを実装する必要があります。

■HttpSessionBindingListenerインターフェイス

public interface HttpSessionBindingListener extends java.util.EventListener
このインターフェイスを実装したオブジェクトは、セッションオブジェクトにバインド(追加)されるとき、またはセッションオブジェクトからアンバインド(削除)されるときに、HttpSessionBindingEventオブジェクトによって通知を受けることができるようになります。

 通知は、サーブレットでセッションオブジェクトから属性を明示してバインドしたり、アンバインドしたりすることばかりではなく、セッションオブジェクトが無効化されたり、セッションオブジェクトがタイムアウトになったりしたときにも行われます。

■メソッド

public void valueBound(HttpSessionBindingEvent event)
オブジェクトがセッションオブジェクトにバインドされるときに発生するイベントに対する処理を行います。

public void valueUnbound(HttpSessionBindingEvent event)
オブジェクトがセッションオブジェクトからアンバインドされるときに発生するイベントに対する処理を行います。

 セッションにバインドされるオブジェクトがHttpSessionBindingListenerを実装している場合は、セッションオブジェクトのsetAttribute()メソッドを実行すると、コンテナがHttpSessionBindingListener.valueBoundを呼び出します。次にコンテナは、Webアプリケーション内のすべての HttpSessionAttributeListener に通知します。

 また、セッションオブジェクトのremoveAttribute()メソッドを実行すると、コンテナがHttpSessionBindingListener.valueUnboundを呼び出します。次にコンテナは、Webアプリケーション内のHttpSessionAttributeListenerに通知します。

 次のサンプルプログラムは、HttpSessionBindingListenerとHttpSessionListener,HttpSessionAttributeListenerを利用したものです。

SampleAccessCounter.java -- サーブレット
package module2;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SampleAccessCounter extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse res) throws 
ServletException, IOException {
    System.out.println("-- SampleAccessCounter --");

    InfoBean info;
    String message;
    HttpSession session = req.getSession(false);

    if (session == null || session.getAttribute("message") == null) {
      session = req.getSession(true);
      info = new InfoBean();
      info.setMsg("1");
    } else {
      info = (InfoBean)session.getAttribute("message");
      info.setMsg(">1");
    }
    session.setAttribute("message", info);

    res.setContentType("text/html;charset=Shift_JIS");
    PrintWriter out = res.getWriter();
    out.println("<HTML><HEAD></HEAD><BODY><P>"
+info.getMsg()+"</BODY><HTML>");

  }
}


InfoBean.java -- HttpSessionBindingListenerを実装したJavaBeanクラス
package module2;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import module2.InfoBean;

public class InfoBean implements Serializable,
 HttpSessionBindingListener {
  private String msg;
  public InfoBean () {
    msg = "No message";
  }
  public void setMsg(String msg) {
    this.msg = msg;
  }
  public String getMsg() {
    return msg;
  }
  public void valueBound(HttpSessionBindingEvent event) {
    System.out.println("InfoBean:valueBound()実行");
  }
  public void valueUnbound(HttpSessionBindingEvent event) {
    System.out.println("InfoBean:valueUnbound()実行");
  }
}


SampleSessionListener.java -- リスナ
package listeners;
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;

public class SampleSessionListener implements HttpSessionListener, 
HttpSessionAttributeListener {
  public void sessionCreated(HttpSessionEvent se) {
    String sid = se.getSession().getId();
    System.out.println("Listener:新規セッションID:"+sid+" 作成");
  }

  public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("Listener:セッションID:"+se.getSession().getId()+" 削除");
  }

  public void attributeAdded(HttpSessionBindingEvent se) {
    System.out.println("Listener:セッション属性追加");
  }

  public void attributeRemoved(HttpSessionBindingEvent se) {
    System.out.println("Listener:セッション属性削除");
  }

  public void attributeReplaced(HttpSessionBindingEvent se) {
    System.out.println("Listener:セッション属性変更");
  }
}


web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <servlet>
    <servlet-name>SampleAccessCounter</servlet-name>
    <servlet-class>module2.SampleAccessCounter</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SampleAccessCounter</servlet-name>
    <url-pattern>/sampleaccesscounter</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>listeners.SampleSessionListener</listener-class>
  </listener>
</web-app>


stdout.log -- 実行結果
-- SampleAccessCounter --
Listener:新規セッションID:3534395535AE5FAF07FDF1A9C507DC74 作成
InfoBean:valueBound()実行
Listener:セッション属性追加
-- SampleAccessCounter --
InfoBean:valueUnbound()実行
InfoBean:valueBound()実行
Listener:セッション属性変更

■HttpSessionActivationListenerインターフェイス

public interface HttpSessionActivationListener extends java.util.EventListener
セッションオブジェクトにバインドされたオブジェクトは、セッションオブジェクトが非活性化されたり、活性化されたりすることを通知するコンテナのイベントを受けることができます。

■メソッド

public void sessionWillPassivate(HttpSessionEvent se)
セッションオブジェクトが間もなく非活性化(パッシブ)されるときに発生するイベントに対する処理を行います。

public void sessionDidActivate(HttpSessionEvent se)
セッションオブジェクトがちょうど活性化(アクティブ)されるときに発生するイベントに対する処理を行います。

 分散コンテナ環境で、セッションが JVM 間を移動すると、HttpSessionActivation Listenerインターフェイスを実装しているすべてのセッション属性に対して通知が行われます。

POINT
setAttribute()メソッドによって、HttpSessionBindingListenerを実装したオブジェクトがセッションオブジェクトに設定されると、valueBound()メソッドが呼び出されます。removeAttribute()メソッドによって、HttpSessionBindingListenerを実装したオブジェクトがセッションオブジェクトに削除されると、valueUnbound()メソッドが呼び出されます。

KEYWORD
■活性化(アクティブ)
サーブレットコンテナにセッションオブジェクトが存在し、利用可能な状態のことをいいます。

■非活性化(パッシブ)
サーブレットコンテナにあるセッションオブジェクトが外部記憶装置などに退避され、保持された状態のことをいいます。

   ワンポイントQuestionの解答

正解 A

Java2ラーニングブック −Web Component Developer編−

本記事は@ITハイブックスシリーズ「J2EEラーニングブック −Web Component Developer編−」(技術評論社)から、一部の内容を編集し転載したものです。本書の詳細は「@ITハイブックス」サイトでご覧いただけます。

 

Javaプログラミング・ワンポイントレクチャー INDEX





Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間