セッションスコープ
(ブログ記事の一覧は「こちら」)
セッションとは、サーバー側でデータを保持する仕組みのことです。
セッションスコープとは、クライアントからのリクエスト(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); } }
課題
上記のサンプルについて、入力項目を「名前」「趣味」から、「特技」を加えたものに修正してください。