セッションによるリクエストの継続

本章のプログラムを御覧の際には、Tomcatが必要です。
こちらからダウンロード出来ます。

ファイルはzipフォルダに納められています。
解凍ソフト(Aladdin Expander等)を使って解凍して下さい。

セッションの取得

該当するセッションを取得する為に、HttpServletRequestクラスの以下のメソッドを使います。

戻り値 メソッドの詳細
HttpSession getSession() HTTPリクエストに対応するセッションを取得
未だセッションが無い場合は、新しくセッションを作成
例: HttpSession session = req.getSession();

HttpSessionクラス

セッションを管理する為に、HttpSessionインターフェースが用意されています。
主なメソッドは以下の通りです。

戻り値 メソッドの詳細
void invalidate() セッションを終了し、バインドされている情報を無効に
boolean inNew() セッションが新しく作られた物である時はtrue、既に存在していた時にはfalseを返す
String getId() セッションIDを取得
例: session.invalidate();
String id = session.getId();

JSPの暗黙のオブジェクトsession

JSPでは、暗黙のオブジェクトとしてsessionが用意されており、サーブレットでは書かなければならない、「HttpSession session = req.getSession();」を省略して、いきなりsessionを使います。

クラス変数の宣言

「<%」と「%>」タグの中で、変数の宣言を行うと、ローカル変数として宣言されます。
クラス変数を宣言したい時には、以下のタグを使います。

<%! クラス変数の宣言 %>

クラス変数は、スレッドが終了しても継続して使えますが、其の反面、複数のスレッドが同時に起動されていてもクラス変数自体は1つしか存在しないので、取り扱いには注意が必要です。

例: <%! int total = 0; %>

上記の「total」は、JSPがロードされている間、最初の1回しか初期化されない為、合計値を求めようとすると履歴の全てを累積して計算されて終います。

HTMLのコメント文

HTMLにもコメントを沢山入れておきましょう。
HTMLでは、以下のタグで囲まれた部分は、無視されます。

<!-- -->

此のタグは、HTMLのタグです。
従って、此のタグで囲まれた部分はブラウザでは非表示ですが、ソースで見られる状態でクライアントに送信されます。

JSPのコメント文

JSPにもコメントを沢山入れておきましょう。
「<%」と「%>」で囲まれた部分はJavaなので、Javaのコメント記述用の「/*」「*/」と「//」記号が其の侭使えます。
其の他に、下記のタグがJSPのコメント文となり、クライアントにも送信されません。

<%-- コメント文 --%>

暗黙のオブジェクト

JSPでは、宣言せずに使える暗黙のオブジェクト名が用意されています。
以下に一覧表を示します。

ページの属性名一覧

暗黙のオブジェクト 変換後のクラス 説明
request ServletRequest サーブレットの「doGet」や「doPost」の1つ目の引数
クライアントからの要求情報を保持
<% request.getParameter(・・・); %>
response ServletResponse サーブレットの「doGet」や「doPost」の2つ目の引数
クライアントからの応答情報を保持
<% response.getWriter(); %>
pageContext PageContext PageContextクラスは、サーブレットで持っているセッションやオブジェクトの情報を管理するクラス
JSP内では、余り使われない
session HttpSession HttpSessionは、セッション情報を保持するクラス
<% session.getAttribute(); %>
application ServletContext ServletContextクラスは、サーブレットの環境情報を保持しているクラスで、APIのバージョンやファイルが実際に置かれているパス名等を取り出せるが、JSP内では、余り使われない
out JSPWriter クライアントに対する文字列の出力先
<% out.print(text); %>
config ServletConfig ServletConfigクラスは、サーブレットの設定情報を保持しているクラス
JSP内では、余り使われない
page Object サーブレットの「this」と同じ
exception Throwable 「Throwable」は、エラー情報を保持するクラス

includeアクション

JSPに、他のJSPを含められます。
タグは以下の様に書きます。

<jsp:include page = "ファイル名" flush = "true"又は"false"/>

ファイル名は先頭に「/」が有る時は、コンテキスト(此の場合は「yoyaku」)からの絶対パスとなり、先頭に「/」が無い場合は、相対パスになります。

例: <jsp:include page = "yoyaku.jsp" flush = "true"/>

「flush」が「true」の時は、バッファがフラッシュされます。
デフォルト値は「false」です。
以下の様に書くと、インクルードされるJSPにパラメータを渡せます。

<jsp:include page = "ファイル名" flush = "true"又は"false">
<jsp:param name = "パラメータ名" value = "パラメータ値" />
</jsp:include>

サーブレットからのリクエストの転送

サーブレットに対するリクエストを他のサーブレットやJSPに転送するには、RequestDispacherインターフェースのforwardメソッドを使って、次の様に書きます。

getServletContext().getRequestDispatcher("転送先").forward(req, res);

此処での転送先には、コンテキストルート(此の場合は「yoyaku」)からの絶対パスを書きます。
絶対パスですから、先頭は必ず「/」で始まります。
JSPやHTMLは拡張子迄書きますが、サーブレットの場合にはサーブレット名を指定するので、拡張子は書きません。

例: getServletContext().getRequestDispatcher("/jsp/jspSample.jsp").forward(req, res);
getServletContext().getRequestDispatcher("/servlet/ServletSample").forward(req, res);
getServletContext().getRequestDispatcher("/htmlSample.html").forward(req, res);

サーブレットから、他のサーブレットやJSPにリクエストを転送する際、setAttributeメソッドを使って、パラメータと一緒に転送出来ます。
パラメータは、「パラメータ名」と「パラメータ値」を1対として、1つ指定します。

req.setAttribute("パラメータ名", "パラメータ値");

パラメータ名は文字列でなければなりませんが、パラメータ値は、オブジェクトを何でも指定出来ます。

例: req.setAttribute("msg", "安全は人とクルマでつくるもの"); //パラメータ値が文字列の例
Color c = Color.blue;
req.setAttribute("color", c);
//パラメータ値がColorクラスのオブジェクトの例

転送されたサーブレットやJSPでは、以下の様にパラメータを取り出します。

(パラメータ値の型)request.getAttribute("msg");

サーブレット側で転送したパラメータ値の型と転送先で受け取る型は、一致していなければなりません。

例: String message = (String)request.getAttribute("msg"); //文字列のパラメータ値を受け取る例
Color color = (Color)request.getAttribute("col"); //Colorクラスのパラメータ値を受け取る例

セッションに情報をバインド

セッションに情報をバインドするには、HttpSessionインターフェースのsetAttributeメソッドを使って、「NAME」と「VALUE」の組を指定します。
「NAME」は文字列でなければなりませんが、「VALUE」にはオブジェクトを指定出来ます。

戻り値 メソッドの詳細
void setAttribute(String name,Object value) 1組の情報をセッションにバインド

此処では仮に、「NAME」に「userInf」を指定し、「VALUE」にはログイン画面で入力されたStringクラスのIDを指定してバインドする事にしましょう。

例: thisSession.setAttribute("userInf", userID);

バインドされたメッセージを他のページから取得するには、HttpSessionインターフェースのgetAttributeメソッドを使って「NAME」を指定し、該当する「VALUE」を得ます。

戻り値 メソッドの詳細
Object getAttribute(String name) バインドされているオブジェクトの中からnameに該当するオブジェクトを取得

戻り値がObjectクラス、つまり、全てのクラスにとってのスーパークラスなので、此のクラスを必要としているクラスに代入する為に、キャスト演算子を使います。

例: String userID = (String)session.getAttribute("userInf");

画面のつながり

ログイン画面の入力データのチェックと其れが不完全だった時のメッセージ画面を含め、各画面をつなげます。

ソース ダウンロード
SessionNext.java sessionTest.jsp Session.zip
CheckLoginSession.java yoyakuJyoukyou.jsp Yoyaku02.zip

戻る