サーブレットとJSP間のデータは、データクラス、データBeanとして作成します。
データクラス、データBeanにはスコープという概念があり、データの有効範囲を設定できます。
このスコープを使い分けることで、効率よく通信を行うことができます。
サーブレットにはセッション管理機能があるため、複数のHTTPプロトコルにまたがるデータや、複数のサーブレットで共通なデータを管理することもできます。
データ変数は、setAttribute()メソッドで設定し、getAttribute()メソッドで参照します。
また、removeAttribute()メソッドで削除することもできます。
以下のサンプルでは、それぞれのスコープ毎のアクセス例を示しています。
// データ変数の作成と設定 インスタンス変数名 = new データクラス名(); オブジェクト.setAttribute("データ変数名", インスタンス変数名); // データ変数の取得 データクラス名 インスタンス変数名 = (データクラス名)オブジェクト.getAttribute("データ変数名"); // データ変数の削除 オブジェクト.removeAttribute("データ変数名"); |
データクラスをアプリケーション変数、セッション変数、リクエスト変数にそれぞれ代入し、以前のIDの値と現在のIDの値を表示しています。
アプリケーション変数では、他のコンピュータやブラウザなどからアクセスがあると、直前にアクセスがあったIDの値が表示されます。
セッション変数では、同じブラウザから再度アクセスがあると、以前のIDの値が表示されます。
データクラスをアプリケーション変数、セッション変数、リクエスト変数に代入し、以前の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> |