セッションによるデータ受け渡し(セッションオブジェクトの利用)

前回に引き続き、セッション管理に関するサンプルサーブレットを作成していきます。今回は、サーブレット間でのデータ受け渡しを行います。

まずは、作成していくサーブレットの内容を下記します。

適当な質問フォームを表示し、ユーザーに入力させます。

セッション操作サンプル

「サーブレット呼び出し」ボタンを押せば、入力されたデータがサーブレット「SampleSessionCtl」に渡されます。

サーブレット「SampleSessionCtl」では、セッションオブジェクトを生成し、生成したセッションオブジェクトに、フォームから受け取ったデータを保存します。さらに、そのデータとセッションIDを表示するHTMLをレスポンスとして返します。

セッション操作サンプル

「次のサーブレット呼び出し」をクリックすると、サーブレット「SampleSessionGetServlet」を呼び出します。

サーブレット「SampleSessionGetServlet」では、セッションオブジェクトを取得し、セッションオブジェクトからSampleSessionCtlサーブレットで保存したデータとセッションIDを取得します。さらに、それらのデータを表示するHTMLをレスポンスとして返します。

セッション操作サンプル

サーブレット間でデータが受け渡せていることが確認できます。

セッション操作メソッド一覧

セッションを操作するには、主に下記メソッドを使用します。

void setAttribute(String name, Object value)
セッションオブジェクト(HttpSessionオブジェクト)に属性を保存するメソッドです。引数にはString型の属性名とObject型の属性値を指定します。

下記例では、属性名を「MyName」、属性値を「TARO YAMADA」としています。
HttpSession session = request.getSession();
session.setAttribute(“MyName”, “TARO YAMADA”);

Object getAttribute(String name)
セッションオブジェクトに保存されている属性値を取得するメソッドです。引数には取得したい属性名を指定します。戻り値として返される属性値の型はObject型になるので、文字列の場合はString型にキャストします。

HttpSession session = request.getSession();
myName = (String) session.getAttribute(“MyName”);

void setMaxInactiveInterval(int 有効期限)
セッションの有効期限を設定するメソッドです。指定した有効期限を超えるとセッションは無効となり新たなセッションとして管理できます。有効期限はクライアントが最後にアクセスしてからおおよその経過時間を秒単位で指定します。

void invalidate()
セッションオブジェクトを明示的に無効にするメソッドです。セッション管理に有効期限が設定されている場合はクライアントからアクセスがないまま一定時間経過すると、自動的にセッションは無効になります。一方、任意のタイミングで明示的に無効にしたい場合は本メソッドを使用します。

サンプルサーブレットのソースコード

以降に各サーブレットのソースコードを記載します。(冗長な部分は省略し、主要な部分のみ記載しています。)

まずは、サーブレット呼び出し用のフォームを作成します。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>セッション管理サーブレットサンプル(データ受け渡し)</title>
</head>
<body>
<h1>セッション管理サーブレットサンプル(データ受け渡し)</h1>
<form action="SampleSessionCtl" method="GET">
<p>あなたの名前は?</p>
<input type="TEXT" name="UserName" size=40>
<p>好きなゲームは?</p>
<input type="TEXT" name="GameName" size=40><br /><br />
<input type="submit" value="サーブレットの呼び出し">
</form>
</body>
</html>

「サーブレットの呼び出し」ボタンをクリックした場合のアクションとして、SampleSessionCtlサーブレットを呼び出してします。その際のリクエストの種類には「GET」を指定しています。

SampleSessionCtlサーブレットのdoGet()メソッドには下記のように記述します。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String userName = request.getParameter("UserName");
    String gameName = request.getParameter("GameName");
    
    HttpSession session = request.getSession();
    session.setAttribute("UserName", userName);
    session.setAttribute("GameName", gameName);

    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>セッションの生成</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>セッションの生成(ページ1)</h1>");
    out.println("<p>あなたの名前は「" + userName + "」です。</p>");
    out.println("<p>好きなゲームは「" + gameName + "」です。</p>");
    out.println("<p>セッションIDは「" + session.getId() + "」です。</p>");
    out.println("<a href=\"SampleSessionGetServlet\">次のサーブレット呼び出し</a>");
    out.println("</body>");
    out.println("</html>");
}

getSession()メソッドでHttpSessionオブジェクト生成し、setAttribute()メソッドでフォームから受け取ったデータをセッションオブジェクトに保存しています。

「次のサーブレット呼び出し」のリンク先として、SampleSessionGetServletサーブレットを指定します。その場合のリクエストの種類には「GET」になります。

SampleSessionGetServletサーブレットのdoGet()メソッドには下記のように記述します。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String userName = "";
    String gameName = "";
    
    HttpSession session = request.getSession();
    userName = (String) session.getAttribute("UserName");
    gameName = (String) session.getAttribute("GameName");
    
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>セッションオブジェクトの取得</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>セッションオブジェクトの取得(ページ2)</h1>");
    out.println("<p>あなたの名前は「" + userName + "」です。</p>");
    out.println("<p>好きなゲームは「" + gameName + "」です。</p>");
    out.println("<p>セッションIDは「" + session.getId() + "」です。</p>");
    out.println("<a href=\"SampleSessionCtl\">前のサーブレットに戻る</a>");
    out.println("</body>");
    out.println("</html>");
}

ここでもgetSession()メソッドを呼び出していますが、今回は、既にセッションが開始されているので、セッション管理の開始時に生成されたHttpSessionオブジェクトが戻り値として返されます。そのため、getAttribute()メソッドにより、SampleSessionCtlサーブレットでセッションオブジェクトに保存したデータを取得できます。