Servlet日記(2001/04/08)

本日の成果

 JSP内でJavaBeansを使うときに指定するscope属性で、どの値を指定するとどうなるかについて、JSPの仕様書にも書かれているのですが、簡単なプログラムで確かめてみました。題材は、[1]に倣ってカウンタです。

 まず、カウンタbeanを作ります。これは次のような、何の変哲もないものです。

package counterbean;

public class Counter {
  private int counter;

  public Counter() {
  }
  public int getCounter() {
    return ++counter;
  }
  public void setCounter(int newCounter) {
    counter = newCounter;
  }
}

 で、分かりやすいところから、scope属性の値がapplicationの場合とsessionの場合は、次のようなコードを作りました。

<jsp:useBean id="counter" scope="application" class="counterbean.Counter" />

<html>
<head><title>Scope Test</title></head>
<body>Counter = <%= counter.getCounter() %></body>
</html>

 これを実行してみると、applicationの場合はアクセスするたびにカウンタ値が増えていきます。同様に、scope属性の値がsessionの場合も、同様にアクセスするたびにカウンタ値が増えます。この二つの違いは、異なるクライアントからアクセスすると、applicationの場合はそれらのトータルのカウンタ値が表示されるのに対し、sessionの場合は各クライアントごとにカウンタ値が表示されることです。

 次に、scope属性の値がpageとrequestの場合を試してみますが、これらはどちらも、上のコードでは何回アクセスしても値が1のままで、違いが分かりません。そこで次のように変更しました。これは、pageの場合です。

<jsp:useBean id="counter" scope="page" class="counterbean.Counter"/>

<html>
<head><title>Scope Test</title></head>
<body>Counter1 = <%= counter.getCounter() %><br>
Counter2 = <jsp:include page="counterpage2.jsp" flush="true" /></body>
</html>

 includeされるcounterpage2.jspファイルは次のようにしました。これもpageの場合です。

<jsp:useBean id="counter" scope="page" class="counterbean.Counter"/>

<%= counter.getCounter() %>

 これで実行してみると、pageの場合は二つの値が共に1であるのに対して、requestの場合は1と2になりました。というわけで、pageの場合はJSPファイルを実行する度に、requestの場合はクライアントからのアクセスごとに、sessionの場合はセッションごとにbeanが用意され、applicationの場合は全体で一つということでしょう。

参考文献

  1. ジェームズ・グッドウィル, JSPクイックリファレンス, ピアソン・エデュケーション, 2001年

本日の教訓

 scope属性の値による振る舞いの違いが分かりました。

Servlet日記の目次 ホーム