サーブレット+JSP+データクラス/Beanを使った、セッション管理の方法について解説します。
HTTPプロトコルでは、1回のリクエストに対して、画面を表示して終了してしまいます。
従って、複数の画面に渡って処理を行う場合には、セッション管理が必要となります。
サーブレットにはセッション管理機能があり、複数のHTTPプロトコルにまたがるデータを管理することができます。
セッション管理の例として、以下のような画面構成をもとにして解説します。
複数のJSPファイルの画面を、1つのサーブレットで処理しています。
そこで、サーブレットが表示する画面を識別するため、画面ID(scr)を設定しています。
この画面IDによって、サーブレットはどの画面からの指示かを知ることができます。
ユーザ名入力画面では、ユーザ名を入力します。 入力したデータは、AddrServletのscr="USER"の処理で、JSPで使うセッション変数に格納しています。
住所入力画面では、住所、電話番号などの情報を入力します。 入力したデータは、AddrServletのscr="ADDR"の処理で、JSPで使うセッション変数に格納しています。
住所表示画面では、ユーザ名と、住所、電話番号などの情報を表示します。 AddrServletが設定したセッション変数の値を、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ファイルは基本的に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として作成します。
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;
};
|
画面定義用の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>
|