セッションスコープ(基本編)
■セッションスコープの概要
・セッションスコープに保存されたインスタンスはブラウザを閉じるか、削除するまで利用可能
・リクエストスコープとは異なり、リクエストを跨いでの利用が可能
・リダイレクト先でも利用可能
・同一ブラウザかつ、別タブを開いている場合はメモリに注意が必要 ※理由はこちら→【詳解】セッションスコープ
※リクエストスコープの解説に関してはこちら→リクエストスコープ
①セッションスコープにインスタンスを保存
【基本構文】
import javax.servlet.http.HttpSession;
.
.
.
HttpSession session = request.getSession();
session.setAttribute("属性名", インスタンス);
②セッションスコープのインスタンスを取得(getAttribute)
【基本構文】
session.getAttribute("属性名");
※元の型にキャストする必要があるので注意が必要
③セッションスコープのインスタンスを取得(EL式)
【基本構文】
${属性名.プロパティ)}
■サンプルアプリケーションでリクエストスコープとセッションスコープの違いを確認
【サンプルアプリケーションの概要】
・ログイン画面でフォームに入力した値を確認画面(response①)でスコープのインスタンスをを表示
・更に登録画面(response②)でもスコープのインスタンスを表示
【サンプルアプリケーションの構成】
・User.java(JavaBeansクラス)
・MainController.java(サーブレットクラス)
・login.jsp(ログイン画面) ※最初に遷移する画面
・confirm.jsp(確認画面) ※ログイン画面の遷移先画面
⇒リクエストスコープとセッションスコープの値を取得可能(response①)
・menu.jsp(メニュー画面) ※確認画面の遷移先画面
⇒セッションスコープの値を取得可能(response②)
・404.jsp(Not Found画面) ※今回は必要ないので割愛
【ポイント】
・リクエストスコープの場合
⇒リクエストを跨ぐ登録画面(response②)にはリクエストスコープの値は表示されない
・セッションコープの場合
⇒リクエストを跨ぐ登録画面(response②)にもセッションスコープの値は表示される
【サンプルアプリケーションのソースコード】
・User.java(JavaBeansクラス)
package model;
public class User {
private String userName;
private String pass;
public User() {}
public User(String userName, String pass) {
this.userName = userName;
this.pass = pass;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
・MainController.java(サーブレットクラス)
※リクエストスコープの場合はそのまま
※セッションスコープの場合は59、60行目をコメントアウトし、56行目をコメントにする
package controller;
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 model.User;
@WebServlet("/MainController")
public class MainController extends HttpServlet {
private static final long serialVersionUID = 1L;
public MainController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//遷移先のパスワード
String path = "";
//リクエストパラメーターを取得
String param = request.getParameter("action");
//リクエストパラメーターがnullの場合はログインページへ遷移
if (param == null) {
path = "WEB-INF/jsp/longin.jsp";
} else if (param.equals("regist")) {
path = "WEB-INF/jsp/menu.jsp";
} else {
path = "WEB-INF/jsp/404.jsp";
}
//ページ遷移
RequestDispatcher dispatcher = request.getRequestDispatcher(path);
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//フォーム画面で送信されたエンコードされたパラメーターを文字コードUTF-8でデコード
request.setCharacterEncoding("UTF-8");
//フォーム画面で入力された内容を各変数にセット
String userName = request.getParameter("userName");
String pass = request.getParameter("pass");
//インスタンスにフォームの内容を保存
User user = new User(userName, pass);
//リクエストスコープに保存する場合
request.setAttribute("user", user);
//セッションスコープに保存する場合
//HttpSession session = request.getSession();
//session.setAttribute("user", user);
RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/jsp/confirm.jsp");
dispatcher.forward(request, response);
}
}
・login.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="/JSP_Project/MainController" method="POST">
<p>ユーザー名:<input type="text" name="userName"></p>
<p>パスワード:<input type="password" name="pass"></p>
<p><input type="submit" value="確認"></p>
</form>
</body>
</html>
・confirm.jsp(確認画面) ※ログイン画面の遷移先画面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>確認画面</title>
</head>
<body>
<p>入力されたユーザー名</p>
<p><c:out value="${user.userName}" /></p>
<p>入力されたパスワード</p>
<p><c:out value="${user.pass}" /></p>
<p>この内容でログインしてよろしいですか?</p>
<!-- 戻るを押下した場合はリクエストパラメーター付与なし -->
<a href="/JSP_Project/MainController"><input type="button" value="戻る"></a>
<!-- ログインを押下した場合、リクエストパラメーター「action」に「regist」を付与して送信 -->
<a href="/JSP_Project/MainController?action=regist"><input type="button" value="ログイン"></a>
</body>
</html>
・menu.jsp(メニュー画面) ※確認画面の遷移先画面
※リクエストスコープの場合:値(userName)は表示されない
※セッションスコープの場合:値(userName)は表示される
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メニュー画面</title>
</head>
<body>
<h1>メニュー画面</h1>
ログインユーザー:<c:out value="${user.userName}" />
</body>
</html>