セッションスコープ

(ブログ記事の一覧は「こちら」)

セッションとは、サーバー側でデータを保持する仕組みのことです。

セッションスコープとは、クライアントからのリクエスト(request)とサーバーで作成したセッション(Session)の間でのスコープのことです。

セッションスコープは、クライアントが作成したセッションが破棄されるまで有効です。
セッションが破棄される例は、以下のものがあります。

  • 破棄するメソッド(removeAttribute)を呼び出した場合
  • 一定時間が経過した場合
  • ブラウザを閉じた場合


セッションスコープに保存
   // UserInfoクラス(JavaBeans)
    UserInfo userInfo = new UserInfo();
    userInfo.setName(strName);
    userInfo.setHobby(strHobby);

    // セッションスコープに保存
    HttpSession session = request.getSession();
    session.setAttribute("user_info", userInfo);
セッションスコープからインスタンスを取得
<%@ page import="com.test.session.UserInfo" %>
<%
    // セッションスコープからUserInfoクラスのインスタンスを取得
    UserInfo userInfo = (UserInfo) session.getAttribute("user_info");
%>

"user_info" は属性名です。保存と取得のときに文字列として一致していれば、属性名は自由に設定して問題ありません。

サンプルプログラム

MVCモデルで作成した、セッションスコープを利用したサンプルを作成します。

画面の流れは以下のようになります。

「入力フォーム」 ⇒ 「確認画面」 ⇒ 「完了画面」

対応するプログラムのファイルは以下のようになります。

[form.jsp]
 ⇒ (( [MainServlet.java] ↔ [UserInfo.java] )→ [confirm.jsp] )
 ⇒ ( [MainServlet.java] → [done.jsp] )

プロジェクト名、パッケージ名は、以下のようにしています。

プロジェクト名:SessionTest
パッケージ名:com.test.session

【M】JavaBeans(UserInfo.java

package com.test.session;

import java.io.Serializable;

public class UserInfo implements Serializable {

    private String name;
    private String hobby;

    public UserInfo() {}

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHobby() {
        return this.hobby;
    }
 
    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
}

【V】JSP(入力フォーム :form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>入力フォーム</title>
</head>
<body>
    <form action="/SessionTest/MainServlet" method="post">
        名前:<input type="text" name="name">
        趣味:<input type="text" name="hobby">
        <input type="submit" value="送信する">
    </form>
</body>
</html>

【V】JSP(確認画面:confirm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="com.test.session.UserInfo" %>
<%
    // UserInfoクラス(JavaBeans)
    UserInfo userInfo = (UserInfo) session.getAttribute("user_info");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>確認画面</title>
</head>
<body>
    <p>確認</p>

    <p>
    名前:<%= userInfo.getName() %>
    </p>
    <p>
    趣味:<%= userInfo.getHobby() %>
    </p>

    <a href="/SessionTest/MainServlet">戻る</a>
    <a href="/SessionTest/MainServlet?action=done">進む</a>
</body>
</html>

【V】JSP(完了画面:done.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="com.test.session.UserInfo" %>
<%
    // UserInfoクラス(JavaBeans)
    UserInfo userInfo = (UserInfo) session.getAttribute("user_info");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>完了画面</title>
</head>
<body>
    <p>完了</p>

    <p>
    名前:<%= userInfo.getName() %>
    </p>
    <p>
    趣味:<%= userInfo.getHobby() %>
    </p>

    <a href="/SessionTest/MainServlet">戻る</a>
</body>
</html>

【C】サーブレット(MainServlet.java

package com.test.session;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/MainServlet")
public class MainServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public MainServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // フォワード先
        String strForwardPath = null;
        
        String strAction = request.getParameter("action");
        
        if (strAction == null) {
            // フォワード先を設定(入力フォーム)
            strForwardPath = "/form.jsp";
            
        } else if (strAction.equals("done")) {
            // フォワード先を設定(完了画面)
            strForwardPath = "/done.jsp";
        }
        
        // 設定されたフォワード先にフォワード
        RequestDispatcher dispatcher = request.getRequestDispatcher(strForwardPath);
        dispatcher.forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 文字コードをセット(日本語の文字化けを避ける)
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");

        // 入力フォームの値を取得       
        String strName = request.getParameter("name");
        String strHobby = request.getParameter("hobby");
        
        // UserInfoクラス(JavaBeans)
        UserInfo userInfo = new UserInfo();
        userInfo.setName(strName);
        userInfo.setHobby(strHobby);

        // セッションスコープに保存
        HttpSession session = request.getSession();
        session.setAttribute("user_info", userInfo);

        // フォワード(確認画面)
        RequestDispatcher dispatcher = request.getRequestDispatcher("/confirm.jsp");
        dispatcher.forward(request, response);
    }

}

課題

上記のサンプルについて、入力項目を「名前」「趣味」から、「特技」を加えたものに修正してください。