Javaに関する様々な情報をご紹介します。

4スコープ

Javaに関する様々な情報をご紹介します。

スコープ

このページでは、スコープの種類、スコープのデータ操作方法について解説します。

スコープの種類

スコープとは、データの有効範囲のことです。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を返します。
Enum eration 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. (1)HttpServletRequestインタフェースのオブジェクトreqからsetAttributeメソッドを使用し、requestスコープのデータを登録します。
  2. (2)HttpSessionインタフェースのオブジェクトsessionからsetAttributeメソッドを使用し、sessionスコープのデータを登録します。
  3. (3)ServletContextインタフェースのオブジェクトscからsetAttributeメソッドを使用し、applicationスコープのデータを登録します。
  4. (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. (1)HttpServletRequestインタフェースのオブジェクトreqからgetAttributeメソッドを使用し、引数に指定したrequestスコープのデータを取得します。
  2. (2)HttpSessionインタフェースのオブジェクトsessionからgetAttributeメソッドを使用し、引数に指定したsessionスコープのデータを取得します。
  3. (3)ServletContextインタフェースのオブジェクトscからsgetAttributeメソッドを使用し、引数に指定したapplicationスコープのデータを取得します。
  4. (4)取得したデータをPrintWriterクラスのoutオブジェクトを使用して表示します。

【実行結果】Servletプログラムの実行方法に関しては、Javaの道:Tomcat(プログラム配置・実行)を参照してください。

Javaの道_スコープ

4スコープ