【Java】リクエストスコープ:サーブレットでインスタンスを保存し、JSPで取得する

■スコープ

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

スコープのざっくりイメージ図

▼スコープの種類

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


・ページスコープ

・リクエストスコープ

・セッションスコープ

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

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

▼スコープのお約束

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

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

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

▼JavaBeans

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

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


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

②クラスはpublic

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

④フィールドはprivate

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

■リクエストスコープ

リクエストスコープとは、リクエストごとに生成するスコープである。

スコープの保存期間は、レスポンスが返されるまでである。

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

サーブレットクラスで、二人の年齢、身長、体重の情報をJavaBeansに保存し、JSPファイルで取得する。

情報1人目2人目
名前A君B君
年齢20歳29歳
身長175.5cm183.2cm
体重65.7kg60.3kg

▼フローチャート

▼プログラム仕様

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

インプット処理内容アウトプット
A君用のJavaBeans(DataPhysicalMeasure)をインスタンス
A君の情報*A君の情報を入力する。
A君の情報を保存する。
B君用のJavaBeans(DataPhysicalMeasure)をインスタンス
B君の情報*B君の情報を入力する。
B君の情報を保存する。
【URL】参照JSPファイルを表示する。
*「▼作成するプログラムの概要」参照

【URL】
/WEB-INF/jsp/result_physical_measure.jsp


・JSPファイル(result_physical_measure.jsp)

インプット処理内容アウトプット
A君用のJavaBeans(DataPhysicalMeasure)をインスタンス
B君用のJavaBeans(DataPhysicalMeasure)をインスタンス
A君の情報を出力する。A君の情報*
B君の情報を出力する。B君の情報*
*「▼作成するプログラムの概要」参照

▼画面仕様

①A君の情報を出力する。

②B君の情報を出力する。

▼サンプルコード

・サーブレットクラス(MyPhysicalMeasure.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 beans.DataPhysicalMeasure;


@WebServlet("/MyPhysicalMeasure")
public class MyPhysicalMeasure extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// Beansをインスタンス(A君用)
		DataPhysicalMeasure name_a = new DataPhysicalMeasure();
		
		// A君の情報を入力
		name_a.setName("A");
		name_a.setAge(20);
		name_a.setHeight(175.5);
		name_a.setweight(65.7);
		
		// A君の情報を保存
		request.setAttribute("name_a", name_a);
		
		// Beansをインスタンス(B君用)
		DataPhysicalMeasure name_b = new DataPhysicalMeasure();
		
		// B君の情報を入力
		name_b.setName("B");
		name_b.setAge(29);
		name_b.setHeight(183.2);
		name_b.setweight(60.3);
		
		// B君の情報を保存
		request.setAttribute("name_b", name_b);
		
		// WEB-INF配下のJSPファイルを表示する
		RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/result_physical_measure.jsp");
		dispatcher.forward(request, response);
		
	}


}

・JavaBeans(DataPhysicalMeasure.java)

package beans;

import java.io.Serializable;

public class DataPhysicalMeasure implements Serializable{
	/* フィールド
	 *  名前(String)
	 *  年齢(int)
	 *  身長(double)
	 *  体重(double)
	 */
	private String name;
	private int age;
	private double height;
	private double weight;
	
	// 名前のゲッター/セッター
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	// 年齢のゲッター/セッター
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	// 身長のゲッター/セッター
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	
	// 体重のゲッター/セッター
	public double getweight() {
		return weight;
	}
	public void setweight(double weight) {
		this.weight = weight;
	}
	
	// コンストラクタ(今回は何も設定しない)
	public 	DataPhysicalMeasure() {
	}
}

・JSPファイル(result_physical_measure.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="beans.DataPhysicalMeasure" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>身長・体重</title>
</head>
<body>
<%
	// A君、B君の情報を取得
	DataPhysicalMeasure name_a = (DataPhysicalMeasure)request.getAttribute("name_a");
	DataPhysicalMeasure name_b = (DataPhysicalMeasure)request.getAttribute("name_b");
%>	
	<!-- A君、B君の情報を出力  -->
	<p>名前:<%=name_a.getName() %></p>
	<p>年齢:<%=name_a.getAge() %></p>
	<p>身長:<%=name_a.getHeight() %></p>
	<p>体重:<%=name_a.getweight() %></p>
	<br>
	<p>名前:<%=name_b.getName() %></p>
	<p>年齢:<%=name_b.getAge() %></p>
	<p>身長:<%=name_b.getHeight() %></p>
	<p>体重:<%=name_b.getweight() %></p>
</body>
</html>

▼実行結果

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