Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Servlet・JSP > Servlet −4.スコープ
更新日:2006/10/15
Servlet−4.スコープ
このページでは、スコープの種類、スコープのデータ操作方法について解説します。
スコープの種類
スコープとは、データの有効範囲のことです。Servletでは、requestスコープ、sessionスコープ、applicationスコープの3つのスコープがあります。HTTPセッション間でデータを共有したい場合はsessionスコープ、webアプリケーション間でデータを共有したい場合はapplicationスコープというようにデータの有効範囲によりスコープを使い分けます。データの操作には通常JavaBeansを使用しますが、ここではServletで行う方法について解説します。
requestスコープ
requestスコープはリクエスト間でデータを共有したい場合に使用します。requestスコープでデータを操作する場合は、HttpServletRequestインタフェースのオブジェクトを使用します。forwardメソッドなどでHttpServletRequestインタフェースのオブジェクトをリクエスト先に引き継ぐことでデータを共有できます。
public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

  ・・・・・・・・・・・

  //useridデータをrequestスコープで保存
  req.setAttribute("userid", userid);

  ・・・・・・・・・・・

  //forwardメソッドで、HttpServletRequestインタフェースの
  //reqオブジェクトをリクエスト先に引継ぎ
  RequestDispatcher rd = req.getRequestDispatcher("./xxx");
  rd.forward(req, res);
}
sessionスコープ
HTTPセッション間でデータを共有したい場合に使用します。これにより、異なるページ間でブラウザを閉じるまで、もしくは一定時間経過するまでデータを共有することができます。sessionスコープでデータを操作するためには、HttpSessionインタフェースのオブジェクトを使用します。このオブジェクトはHttpServletRequestインタフェースのgetSessionメソッドで取得できます。
public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

  ・・・・・・・・・・・

  //HttpSessionインタフェースのオブジェクトを取得
  HttpSession session = req.getSession();
  //useridデータをsessionスコープで保存
  session.setAttribute("userid", userid);

  ・・・・・・・・・・・

}
applicationスコープ
webアプリケーション間でデータを共有したい場合に使用します。webアプリケーション間とは、サーブレットコンテナに設定されるwebアプリケーション内のことを言います。applicationスコープでデータを操作するためには、ServletContextインタフェースのオブジェクトを使用します。このオブジェクトはHttpServletクラスのgetServletContextメソッドで取得できます。
public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

  ・・・・・・・・・・・

  //ServletContextインタフェースのオブジェクトを取得
  ServletContext sc = getServletContext();
  //useridデータをapplicationスコープで保存
  sc.setAttribute("userid", userid);

  ・・・・・・・・・・・

}
各スコープのデータ操作方法
各スコープのデータ操作で使用するメソッドについて解説します。各スコープごとに属するオブジェクトは異なりますが、メソッドは各オブジェクトで共通のものが定義されています。
戻り型
メソッド
説明
Object getAttribute(String) 引数に指定されたデータ名に該当するデータ値を返します。該当のデータ名がない場合にはnullを返します。
Enumeration getAttributeNames( ) スコープで利用可能なすべてのデータ名を返します。
void removeAttribute(String) 引数に指定されたデータ名をスコープから削除します。
void
setAttribute(String, Object)
第一引数にデータ名、第二引数にデータ値を指定し、スコープにデータを登録します。すでにデータ名が存在する場合は、新しく指定されたデータ値が上書きされます。
使用例
各スコープを持つデータを登録し、それを次ページで取得、表示する例を記載します。
【SetData.java】各スコープのデータを登録し、GetDataプログラムへフォワードします。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SetData extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse res)
             throws ServletException, IOException {
    String name = new String("Java太郎");
    String id = new String("java");
    String prog = new String("Java-Register");

    //(1)requestスコープのデータを登録
    req.setAttribute("name", name);

    //(2)sessionスコープのデータを登録
    HttpSession session = req.getSession();
    session.setAttribute("id", id);

    //(3)applicationスコープのデータを登録
    ServletContext sc = getServletContext();
    sc.setAttribute("prog", prog);

    //(4)GetDataへフォワード
    RequestDispatcher rd = req.getRequestDispatcher("./GetData");
    rd.forward(req, res);
  }
}
(1). HttpServletRequestインタフェースのオブジェクトreqからsetAttributeメソッドを使用し、requestスコープのデータを登録します。
(2). HttpSessionインタフェースのオブジェクトsessionからsetAttributeメソッドを使用し、sessionスコープのデータを登録します。
(3). ServletContextインタフェースのオブジェクトscからsetAttributeメソッドを使用し、applicationスコープのデータを登録します。
(4). forwardメソッドを使用し、他のプログラムへフォワードします。引数に指定されたreqオブジェクトを通し、フォワード先のプログラムでrequestスコープのデータを取得できます。
【GetData.java】GetDataプログラムで登録されたデータを取得し、表示します。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class GetData extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse res)
              throws ServletException, IOException {

    //(1)requestスコープのデータを取得
    String name = (String)req.getAttribute("name");

    //(2)sessionスコープのデータを取得
    HttpSession session = req.getSession();
    String id = (String)session.getAttribute("id");

    //(3)applicationスコープのデータを取得
    ServletContext sc = getServletContext();
    String prog = (String)sc.getAttribute("prog");

    res.setContentType("text/html; charset=Windows-31J");
    PrintWriter out = res.getWriter();

    //(4)取得したデータの表示
    out.println("<HTML>");
    out.println("<BODY>");

    out.println("名前:" + name);
    out.println("<BR>");
    out.println("ID:" + id);
    out.println("<BR>");
    out.println("プログラム:" + prog);

    out.println("</BODY>");
    out.println("</HTML>");
    out.flush();
    out.close();
  }
}
(1). HttpServletRequestインタフェースのオブジェクトreqからgetAttributeメソッドを使用し、引数に指定したrequestスコープのデータを取得します。
(2). HttpSessionインタフェースのオブジェクトsessionからgetAttributeメソッドを使用し、引数に指定したsessionスコープのデータを取得します。
(3). ServletContextインタフェースのオブジェクトscからsgetAttributeメソッドを使用し、引数に指定したapplicationスコープのデータを取得します。
(4). 取得したデータをPrintWriterクラスのoutオブジェクトを使用して表示します。
【実行結果】Servletプログラムの実行方法に関しては、Javaの道:Tomcat(プログラム配置・実行)を参照してください。
Javaの道_スコープ



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道