サーブレット+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> |