【Java】セッションスコープ:フォーム画面で入力したユーザ情報を保持する

■スコープ

サーブレットクラスで作成したインスタンスをJSPファイルで利用するために、スコープを使用する。
スコープとは、インスタンスを保存する領域であり、サーブレットクラス・JSPファイル共にインスタンスの保存・保存したインスタンスの取得をすることができる。

画像に alt 属性が指定されていません。ファイル名: image-4-1024x220.png
スコープのざっくりイメージ図

▼スコープの種類

スコープは、以下、4つの種類がある。


・ページスコープ

・リクエストスコープ

・セッションスコープ

・アプリケーションスコープ

※保存したインスタンスの有効期限の長さが異なる。

▼スコープのお約束

スコープに保存できるのはあくまでインスタンスのみである。

int型やString型などのデータ型の変数を保存することはできない。

データ型の変数を保存したい場合は、ラッパークラス(データ型のみを保持するクラス)を作成し、そのラッパークラスをインスタンス→保存する。

▼JavaBeans

スコープには、JavaBeansと呼ぶクラスのインスタンスを保存することが多い。

JavaBeans(※現場によってはBeanと呼ぶこともある)とは、クラスの独立性を高め、部品として再利用するために、以下のルールがある。


①直列可能(java.io.Serializableをimportし、クラスに対してインターフェースしている)

②クラスはpublic

③publocで引数のないコンストラクタを持つ

④フィールドはprivate

⑤取得、保存はゲッター/セッターを使用する。

■セッションスコープ

セッションスコープにおいて、保存したインスタンスは、開発者が明示的に削除するか、ブラウザを閉じるまで保持される。

リクエスト→レスポンス後もインスタンス情報は残るので、リクエストを跨いで使用可能である。
★ユーザログイン情報などに使用されている場合が多い。

▼作成するプログラムの概要

フォーム画面で入力した情報をセッションで保持して画面に表示する。

▼フローチャート

▼プログラム仕様

・サーブレットクラス(UserInfoSession.java)

(1)POST処理

インプット処理内容アウトプット
ユーザ情報のJavaBeans(UserInfoBeans)をインスタンスする。
【フォーム情報】
ID
名前
パスワード
【フォーム情報】をユーザ情報へセットする。
ユーザ情報をセッションスコープに保存する。
【URL】
*1
JSPファイルへ画面遷移する。

*1:URL(/WEB-INF/jsp/userinfo_session.jsp)

(2)GET処理

インプット処理内容アウトプット
【URL】
*1
JSPファイルへ画面遷移する。

*1:URL(/WEB-INF/jsp/userinfo_session.jsp)


・JSPファイル(userinfo_session.jsp)

インプット処理内容アウトプット
ユーザ情報のJavaBeans(UserInfoBeans)をインスタンスする。
【条件分岐】
▼ユーザ情報がNullの場合
セッションにデータがない旨を出力する。・・・①
▼ユーザ情報がある場合
ユーザ情報を出力する。・・・②
【画面】
①「セッション情報はありません」
②「ID、名前、パスワード」

▼画面仕様

・セッション情報がない場合

①入力フォームを作成する。
「ID」、「名前」:テキスト
「パスワード」:パスワード(伏せ字)
「登録」ボタン押下により、サーブレットクラスへ遷移

②セッション情報がない場合は「セッション情報はありません」を表示する。

・セッション情報がある場合

①入力フォームを作成する。
「ID」、「名前」:テキスト
「パスワード」:パスワード(伏せ字)
「登録」ボタン押下により、サーブレットクラスへ遷移

②セッション情報がある場合は、「登録」ボタン押下時にフォームで設定した「ユーザ情報」を表示する。

▼サンプルコード

・サーブレットクラス(UserInfoSession.java)

package servlet;

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;

import beans.UserInfoBeans;


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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 画面へ遷移
		RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/userinfo_session.jsp");
		rd.forward(request, response);
	
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		// Jspのフォーム画面からユーザ情報を取得
		request.setCharacterEncoding("UTF-8");
		String user_id = request.getParameter("id");
		String user_name = request.getParameter("name");
		String user_password = request.getParameter("password");
		
		// ユーザ情報格納クラスをインスタンス
		UserInfoBeans userinfo = new UserInfoBeans();
		
		// ユーザ情報を格納する
		userinfo.setUserData_Id(user_id);
		userinfo.setUserData_Name(user_name);
		userinfo.setUserData_Password(user_password);
		
		// セッションスコープに登録ユーザを保存
		HttpSession session = request.getSession();
		session.setAttribute("userinfo", userinfo);
		
		// 画面へ遷移
		RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/userinfo_session.jsp");
		rd.forward(request, response);
		
		}

}

・JavaBeans(UserInfoBeans.java)

package beans;

import java.io.Serializable;

public class UserInfoBeans implements Serializable {
	// フィールドを設定
	private String userdata_id;
	private String userdata_name;
	private String userdata_password;
	
	// コンストラクタ(指定なし)
	public UserInfoBeans() {}
	
	// ゲッターとセッターを作成
	public String getUserData_Id() {
		return userdata_id;
	}
	public void setUserData_Id(String userdata_id) {
		this.userdata_id = userdata_id;
	}
	
	public String getUserData_Name() {
		return userdata_name;
	}
	public void setUserData_Name(String userdata_name) {
		this.userdata_name = userdata_name;
	}
	
	public String getUserData_Password() {
		return userdata_password;
	}
	public void setUserData_Password(String userdata_password) {
		this.userdata_password = userdata_password;
	}
}

・JSPファイル(userinfo_session.jsp)

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

<%@ page import="beans.UserInfoBeans" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ユーザ登録&情報</title>
</head>
<body>
<!-- 登録情報入力 -->
<form action="http://localhost:8080/JspServletSample/UserInfoSession" method="post">
	<p>
		ID:<input type="text" name="id">
		<br>
		名前:<input type="text" name="name">
		<br>
		パスワード:<input type="password" name="password">
	</p>
	<input type="submit" value="登録">
</form>

<!-- セッション取得情報(取得できた場合のみ表示) -->
<p>#################### セッション情報 ####################</p>
<!-- セッションの呼びだし -->
<% 
	UserInfoBeans userinfo = (UserInfoBeans)session.getAttribute("userinfo"); 
	if(userinfo == null){
%>
		<p>セッション情報はありません</p>
<%
	} else {
%>
		<p>
			ID:<%=userinfo.getUserData_Id() %>
			<br>
			名前:<%=userinfo.getUserData_Name() %>
			<br>
			パスワード:<%=userinfo.getUserData_Password() %>
		</p>
<%
	}
%>

</body>
</html>

▼実行結果

・起動時


・フォーム入力および「登録」ボタン押下


・セッション情報あり


・セッション情報は残っているため、新しいタブでも情報は保持されたまま

タイトルとURLをコピーしました