■スコープ
サーブレットクラスで作成したインスタンスを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.5cm | 183.2cm |
体重 | 65.7kg | 60.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>