ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

オブジェクトのスコープ

スコープの種類

 サーブレットとJSP間のデータは、データクラス、データBeanとして作成します。 データクラス、データBeanにはスコープという概念があり、データの有効範囲を設定できます。 このスコープを使い分けることで、効率よく通信を行うことができます。
 サーブレットにはセッション管理機能があるため、複数のHTTPプロトコルにまたがるデータや、複数のサーブレットで共通なデータを管理することもできます。

データ変数のアクセス方法

 データ変数は、setAttribute()メソッドで設定し、getAttribute()メソッドで参照します。 また、removeAttribute()メソッドで削除することもできます。
 以下のサンプルでは、それぞれのスコープ毎のアクセス例を示しています。

// データ変数の作成と設定
インスタンス変数名 = new データクラス名();
オブジェクト.setAttribute("データ変数名", インスタンス変数名);

// データ変数の取得
データクラス名 インスタンス変数名 = (データクラス名)オブジェクト.getAttribute("データ変数名");

// データ変数の削除
オブジェクト.removeAttribute("データ変数名");

各種スコープの利用サンプル

 データクラスをアプリケーション変数、セッション変数、リクエスト変数にそれぞれ代入し、以前のIDの値と現在のIDの値を表示しています。
 アプリケーション変数では、他のコンピュータやブラウザなどからアクセスがあると、直前にアクセスがあったIDの値が表示されます。
 セッション変数では、同じブラウザから再度アクセスがあると、以前のIDの値が表示されます。

画面イメージ

スコープのテスト×
スコープのテスト
scope="application"
oldId: masumura
newId: joe

scope="session"
oldId:
newId: joe

scope="request"
newId: joe

JSPのソース

 データクラスをアプリケーション変数、セッション変数、リクエスト変数に代入し、以前のIDの値と現在のIDの値を表示しています。
 jsp:usrBeanタグのscope属性の値に、それぞれのスコープを指定しています。

Scope.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<jsp:useBean id="appData" class="jp.ash.example.ScopeData" scope="application" />
<jsp:useBean id="sesData" class="jp.ash.example.ScopeData" scope="session" />
<jsp:useBean id="reqData" class="jp.ash.example.ScopeData" scope="request" />

<html>
<head><title>スコープのテスト</title></head>
<body>

<h1>スコープのテスト</h1>

<h2>scope="application"</h2>
<pre>
oldId: <%= appData.oldId %>
newId: <%= appData.newId %>
</pre>

<h2>scope="session"</h2>
<pre>
oldId: <%= sesData.oldId %>
newId: <%= sesData.newId %>
</pre>

<h2>scope="request"</h2>
<pre>
newId: <%= reqData.newId %>
</pre>

</body>
</html>

データクラスのソース

 データクラスでは、以前のIDと現在のIDを設定、参照できるようになっています。 publicフィールドを直接、参照更新します。

ScopeData.java
// Copyright (C)1995-2002 ASH multimedia lab. http://ash.jp/
package jp.ash.example;

/** スコープテストデータ **/
public class ScopeData {
  /** oldID **/
  public String oldId;
  /** newID **/
  public String newId;
};

サーブレットのソース

 サーブレットでは、アプリケーション変数は、ServletContextクラスにsetAttributeし、セッション変数は、HttpSessionクラスにsetAttributeし、リクエスト変数は、HttpServletRequestクラスにsetAttributeしています。
 既存の変数がある場合は、それを更新し、ない場合は新規に作成しています。

ScopeServlet.java
// Copyright (C)1995-2002 ASH multimedia lab. http://ash.jp/
package jp.ash.example;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** 変数のスコープテストサーブレット **/
public class ScopeServlet extends HttpServlet {
  public void service (HttpServletRequest req, HttpServletResponse res)
      throws ServletException, IOException {
    ServletContext sc = getServletConfig().getServletContext();
    HttpSession session = req.getSession();
    req.setCharacterEncoding("Shift_JIS");

    // パラメータの取得
    String id = req.getParameter("id");
    if (id == null) { id = "joe"; }

    // アプリケーション変数の取得、設定
    ScopeData appData = (ScopeData) sc.getAttribute("appData");
    if (appData == null) { appData = new ScopeData(); }
    sc.setAttribute("appData", appData);

    appData.oldId = appData.newId;
    appData.newId = id;

    // セッション変数の取得、設定
    ScopeData sesData = (ScopeData) session.getAttribute("sesData");
    if (sesData == null) { sesData = new ScopeData(); }
    session.setAttribute("sesData", sesData);

    sesData.oldId = sesData.newId;
    sesData.newId = id;

    // リクエスト変数の設定
    ScopeData reqData = new ScopeData();
    req.setAttribute("reqData", reqData);

    reqData.newId = id;

    // 画面の表示
    req.getRequestDispatcher("Scope.jsp").forward(req, res);
  }
}

サーブレットの登録

 サーブレットをweb.xmlに登録します。

web.xml
<?xml version="1.0" ?>
<!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>ScopeServlet</servlet-name>
    <servlet-class>jp.ash.example.ScopeServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ScopeServlet</servlet-name>
    <url-pattern>/ScopeServlet/*</url-pattern>
  </servlet-mapping>
</web-app>


Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp