プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

セッションスコープ(基本編)

■セッションスコープの概要

・セッションスコープに保存されたインスタンスはブラウザを閉じるか、削除するまで利用可能
・リクエストスコープとは異なり、リクエストを跨いでの利用が可能
・リダイレクト先でも利用可能
・同一ブラウザかつ、別タブを開いている場合はメモリに注意が必要 ※理由はこちら→【詳解】セッションスコープ
※リクエストスコープの解説に関してはこちら→リクエストスコープ
 
 

①セッションスコープにインスタンスを保存

【基本構文】


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>