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

Webアプリケーションのセッション管理プログラミング

セッション管理

 サーブレット+JSP+データクラス/Beanを使った、セッション管理の方法について解説します。
 HTTPプロトコルでは、1回のリクエストに対して、画面を表示して終了してしまいます。 従って、複数の画面に渡って処理を行う場合には、セッション管理が必要となります。
 サーブレットにはセッション管理機能があり、複数のHTTPプロトコルにまたがるデータを管理することができます。

画面構成

 セッション管理の例として、以下のような画面構成をもとにして解説します。
 複数のJSPファイルの画面を、1つのサーブレットで処理しています。 そこで、サーブレットが表示する画面を識別するため、画面ID(scr)を設定しています。 この画面IDによって、サーブレットはどの画面からの指示かを知ることができます。

ユーザ名入力画面(AddrEnterUser.jsp)

 ユーザ名入力画面では、ユーザ名を入力します。 入力したデータは、AddrServletのscr="USER"の処理で、JSPで使うセッション変数に格納しています。

ユーザ名入力画面×
ユーザ名入力画面
ユーザ名

住所入力画面(AddrEnterAddr.jsp)

 住所入力画面では、住所、電話番号などの情報を入力します。 入力したデータは、AddrServletのscr="ADDR"の処理で、JSPで使うセッション変数に格納しています。

住所入力画面×
住所入力画面
ユーザ名joe
郵便番号
住所
電話番号

住所表示画面(AddrDisp.jsp)

 住所表示画面では、ユーザ名と、住所、電話番号などの情報を表示します。 AddrServletが設定したセッション変数の値を、JSPで参照して表示しています。

住所表示画面×
住所表示画面
ユーザ名joe
郵便番号920-0967
住所 金沢市菊川1-9-6
電話番号076-261-4921

エラー表示画面(AddrErr.jsp)

 エラー表示画面では、エラー情報を表示します。

エラー表示画面×
エラー表示画面

シーケンス図

 以下に、サーブレット+JSP+データクラス/Beanを使ってセッション管理する場合の処理の流れのシーケンス図を示します。 AddrServletでは、画面を表すscr変数によって、セッションの状態を管理しています。

シーケンス図

ファイル構成

 パッケージ名と、ソースファイルの格納ディレクトリは、以下のようにします。

パッケージ名jp.ash.webapp
JSPディレクトリ名/home/WebApp/src/
Javaソースディレクトリ名/home/WebApp/src/jp/ash/webapp/

 サンプルプログラムの主なファイル構成です。

ファイル名ファイルの内容
AddrEnterUser.jspユーザ名入力画面
AddrEnterAddr.jsp住所入力画面
AddrDisp.jsp住所表示画面
AddrErr.jspエラー表示画面
AddrData.java住所情報オブジェクト
AddrServlet.java制御用サーブレットソース
build.xml生成方法を定義した、Ant用ビルドファイル

画面定義JSPソースプログラムの作成

 以下のJSPファイルで画面イメージを定義します。 JSPファイルは基本的にHTMLで記述し、<%= 変数名 %>で、変数の参照を行います。 参照する変数の値は、AddrData.javaに定義されています。
 AddrEnterUser.jspファイルでは、ユーザ名入力画面の定義を行います。

AddrEnterUser.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<jsp:useBean id="addr" class="jp.ash.webapp.AddrData" scope="session" />

<html>
<head><title>ユーザ名入力画面</title></head>
<body>

<h1>ユーザ名入力画面</h1>

<form method="POST" action="AddrServlet">
<input type="hidden" name="scr" value="<%=addr.scr%>" />

<table border="1">
<tr><th>ユーザ名</th><td><input type="text" name="name" /></td></tr>
</table>

<input type="submit" value="OK" />
</form>

</body>
</html>

 AddrEnterAddr.jspファイルでは、住所入力画面の定義を行います。

AddrEnterAddr.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<jsp:useBean id="addr" class="jp.ash.webapp.AddrData" scope="session" />

<html>
<head><title>住所入力画面</title></head>
<body>

<h1>住所入力画面</h1>

<form method="POST" action="AddrServlet">
<input type="hidden" name="scr" value="<%=addr.scr%>" />

<table border="1">
<tr><th>ユーザ名</th><td><%=addr.name%></td></tr>
<tr><th>郵便番号</th><td><input type="text" name="zipcode" /></td></tr>
<tr><th>住所</th>    <td><input type="text" name="address" /></td></tr>
<tr><th>電話番号</th><td><input type="text" name="tel" /></td></tr>
</table>

<input type="submit" value="OK" />
</form>

</body>
</html>

 AddrDisp.jspファイルでは、住所表示画面の定義を行います。

AddrDisp.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<jsp:useBean id="addr" class="jp.ash.webapp.AddrData" scope="session" />

<html>
<head><title>住所表示画面</title></head>
<body>

<h1>住所表示画面</h1>

<table border="1">
<tr><th>ユーザ名</th><td><%=addr.name%></td></tr>
<tr><th>郵便番号</th><td><%=addr.zipcode%></td></tr>
<tr><th>住所</th>    <td><%=addr.address%></td></tr>
<tr><th>電話番号</th><td><%=addr.tel%></td></tr>
</table>

</body>
</html>

 AddrErr.jspファイルでは、エラー表示画面の定義を行います。

AddrErr.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<jsp:useBean id="addr" class="jp.ash.webapp.AddrData" scope="session" />

<html>
<head><title>エラー表示画面</title></head>
<body>

<h1>エラー表示画面</h1>

</body>
</html>

データクラス/Beanソースプログラムの作成

 セッション変数は、データクラス/Beanとして作成します。
 JSPで、scope="session"を指定することで、同一セッション内で有効な変数となります。
 一般的には、getXXXメソッドやsetXXXメソッドを持つ、データクラス/Beanとして作成します。 このサンプルでは、getメソッドやsetメソッドは作成せずに、データクラスのpublicフィールドを直接、参照更新しています。

AddrData.java
package jp.ash.webapp;

/** 住所データ **/
public class AddrData {
  /** 画面ID **/
  public String scr;
  /** ユーザ名 **/
  public String name;
  /** 郵便番号 **/
  public String zipcode;
  /** 住所 **/
  public String address;
  /** 電話番号 **/
  public String tel;
};

制御用サーブレットのJavaソースプログラムの作成

 画面定義用のJSPファイルと、データ設定用、制御用のJavaソースファイルは分けて作成します。
 AddrServletでは、scr変数の値によって、複数の画面の遷移を管理しています。 forwardによって、画面定義用のJSPファイルを呼び出しています。

AddrServlet.java
package jp.ash.webapp;

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

/** 住所サーブレット **/
public class AddrServlet extends HttpServlet {
  public void service (HttpServletRequest req, HttpServletResponse res)
      throws ServletException, IOException {
    HttpSession session = req.getSession();
    req.setCharacterEncoding("Shift_JIS");

    // セッション変数の取得
    AddrData addr = (AddrData) session.getAttribute("addr");
    if (addr == null) { addr = new AddrData(); }
    session.setAttribute("addr", addr);

    // 画面ID(scr)の取得
    String scr = req.getParameter("scr");

    if (scr == null) {
      // ユーザ名入力画面の表示
      addr.scr = "USER";
      req.getRequestDispatcher("AddrEnterUser.jsp").forward(req, res);

    } else if (scr.equals("USER")) {
      // セッション変数(ユーザ名)の設定
      addr.name = req.getParameter("name");

      // 住所入力画面の表示
      addr.scr = "ADDR";
      req.getRequestDispatcher("AddrEnterAddr.jsp").forward(req, res);

    } else if (scr.equals("ADDR")) {
      // セッション変数(住所)の設定
      addr.zipcode = req.getParameter("zipcode");
      addr.address = req.getParameter("address");
      addr.tel     = req.getParameter("tel");

      // 住所表示画面の表示
      addr.scr = "";
      req.getRequestDispatcher("AddrDisp.jsp").forward(req, res);

    } else {
      // エラー画面の表示
      addr.scr = "";
      req.getRequestDispatcher("AddrErr.jsp").forward(req, res);
    }
  }
}

サーブレットの登録方法

 WEB-INF/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>
  <display-name>ASH Sample Web Application</display-name>

  <servlet>
    <servlet-name>AddrServlet</servlet-name>
    <servlet-class>jp.ash.webapp.AddrServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>AddrServlet</servlet-name>
    <url-pattern>/AddrServlet/*</url-pattern>
  </servlet-mapping>

</web-app>


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