
サーブレット&JSPの基本|リクエストスコープを使ったWebアプリ作成
サーブレットで処理し、リクエストスコープで渡し、JSPで表示する。MVCモデルのWebアプリを実際に作ってみよう
リクエストスコープの基本を学ぶと、サーブレットで作成したインスタンスをJSPへ渡せるようになります。
ここでは、その仕組みを使って、MVCモデルに沿ったWebアプリケーションを作成します。
今回作成するのは、学習時間の目標達成率を判定する学習ペース診断アプリです。目標学習時間と実際の学習時間を入力すると、達成率を計算し、学習ペースに応じたアドバイスを表示します。
このアプリケーションでは、入力画面をJSPで表示し、サーブレットでリクエストを受け取り、Javaクラスで計算処理を行い、結果をリクエストスコープに保存します。そして、結果表示用のJSPでリクエストスコープからJavaBeansを取得して、画面に表示します。
リクエストスコープは、サーブレットとJSPをつなぐ大切な受け渡し場所です。実際のプログラムを通して、保存、フォワード、取得、表示の流れを確認していきましょう。
学習ペース診断アプリで作るもの
今回のアプリケーションでは、目標学習時間と実際の学習時間から達成率を計算します。
達成率は、次の計算式で求めます。
達成率 = 実際の学習時間 ÷ 目標学習時間 × 100
入力する単位は分です。
たとえば、目標学習時間が120分で、実際の学習時間が90分なら、達成率は75.0%になります。
学習ペースの判定基準
| 達成率 | 判定 |
|---|---|
| 60%未満 | もう少しペースアップ |
| 60%以上、100%未満 | あと一歩 |
| 100%以上 | 目標達成 |
この判定結果をJavaBeansに保存し、JSPで表示します。
画面遷移の流れ
学習ペース診断アプリは、入力画面と結果画面の2つで構成します。
最初に診断画面を表示します。利用者は目標学習時間と実際の学習時間を入力し、診断ボタンをクリックします。
その後、サーブレットが入力値を受け取り、達成率と判定結果を計算します。計算結果はリクエストスコープに保存され、結果表示用JSPへフォワードされます。
画面の流れ
| 画面 | 内容 |
|---|---|
| 学習ペース診断画面 | 目標学習時間と実際の学習時間を入力する |
| 学習ペース診断結果画面 | 入力値、達成率、判定結果を表示する |
結果画面には、戻るリンクも用意します。戻るリンクをクリックすると、もう一度入力画面を表示できます。
図1:学習ペース診断アプリの画面遷移

この図から分かること
このアプリケーションでは、入力画面から結果画面へ処理が進みます。
利用者が目標学習時間と実際の学習時間を入力して診断ボタンをクリックすると、入力値はリクエストパラメータとしてサーブレットへ送信されます。
サーブレットは入力値を受け取り、モデルに計算処理を依頼します。その結果をリクエストスコープへ保存し、結果画面を表示するJSPへフォワードします。
作成するファイル
このアプリケーションでは、MVCモデルに合わせて5つのファイルを作成します。
作成するファイル一覧
| ファイル | 種類 | 役割 |
|---|---|---|
| StudyPace.java | モデル JavaBeans | 学習時間、達成率、判定結果を持つ |
| StudyPaceLogic.java | モデル 処理クラス | 達成率の計算と判定を行う |
| StudyCheck.java | コントローラ サーブレット | リクエストを受け取り、処理と画面遷移を制御する |
| studyCheck.jsp | ビュー JSP | 学習ペース診断画面を表示する |
| studyCheckResult.jsp | ビュー JSP | 学習ペース診断結果画面を表示する |
モデル、ビュー、コントローラの役割がそれぞれ分かれています。
StudyPace.javaはデータを持つJavaBeansです。StudyPaceLogic.javaは計算処理を担当します。StudyCheck.javaはリクエストを受け取り、どの処理を呼び出し、どの画面へ進むかを決めます。
studyCheck.jspとstudyCheckResult.jspは、画面表示を担当します。
MVCモデルとしての構成
今回のアプリケーションでは、MVCモデルの役割を次のように分担します。
MVCモデルでの役割分担
| MVCの要素 | 今回の担当 | 内容 |
|---|---|---|
| Model | StudyPace.java StudyPaceLogic.java | データ保持と計算処理を担当する |
| View | studyCheck.jsp studyCheckResult.jsp | 入力画面と結果画面を表示する |
| Controller | StudyCheck.java | リクエストを受け取り、処理の流れを制御する |
MVCモデルでは、1つのファイルにすべてを書き込むのではなく、役割ごとにファイルを分けます。
これにより、どこに何が書かれているのかが分かりやすくなります。計算処理を直したい場合はStudyPaceLogic.java、画面を直したい場合はJSP、リクエストの流れを直したい場合はStudyCheck.javaを確認すればよい、というように見通しがよくなります。
図2:学習ペース診断アプリのMVC構成

この図から分かること
学習ペース診断アプリは、MVCモデルに沿って作成します。
StudyCheck.javaはコントローラとしてリクエストを受け取り、入力値を取得します。そして、StudyPace.javaにデータを入れ、StudyPaceLogic.javaに計算処理を依頼します。
計算結果が入ったStudyPaceインスタンスは、リクエストスコープへ保存されます。その後、StudyCheck.javaはstudyCheckResult.jspへフォワードし、JSPがリクエストスコープからStudyPaceを取得して結果を表示します。
処理全体の流れ
このアプリケーションの処理は、入力画面を表示する流れと、結果画面を表示する流れに分けて考えると分かりやすくなります。
入力画面を表示する流れ
| 順番 | 内容 |
|---|---|
| 1 | ブラウザからStudyCheckへGETリクエストを送る |
| 2 | StudyCheckのdoGetメソッドが実行される |
| 3 | studyCheck.jspへフォワードする |
| 4 | ブラウザに学習ペース診断画面が表示される |
結果画面を表示する流れ
| 順番 | 内容 |
|---|---|
| 1 | 診断ボタンをクリックしてPOSTリクエストを送る |
| 2 | StudyCheckのdoPostメソッドが実行される |
| 3 | リクエストパラメータを取得する |
| 4 | StudyPaceインスタンスに入力値を設定する |
| 5 | StudyPaceLogicで達成率と判定結果を設定する |
| 6 | StudyPaceインスタンスをリクエストスコープに保存する |
| 7 | studyCheckResult.jspへフォワードする |
| 8 | JSPがリクエストスコープからStudyPaceを取得して表示する |
この流れで、サーブレットとJSPがリクエストスコープを通して連携します。

Eclipseにおけるパッケージの作成
動的Webプロジェクトを選択して右クリック →「新規」→「パッケージ」を選択します。

ここでは、名前に「model」と入力して、「完了」をクリックします。

「src/main/java」の下に「model」が作成されます。

JavaBeansを作成する
まず、学習ペース診断に関する情報を持つJavaBeansを作成します。
StudyPace.javaには、目標学習時間、実際の学習時間、達成率、判定結果をフィールドとして用意します。
学習ペース診断に関する情報を持つJavaBeansの例
ファイル名: StudyPace.java
package model;
import java.io.Serializable;
public class StudyPace implements Serializable {
private int targetMinutes;
private int actualMinutes;
private double achievementRate;
private String paceType;
public int getTargetMinutes() {
return targetMinutes;
}
public void setTargetMinutes(int targetMinutes) {
this.targetMinutes = targetMinutes;
}
public int getActualMinutes() {
return actualMinutes;
}
public void setActualMinutes(int actualMinutes) {
this.actualMinutes = actualMinutes;
}
public double getAchievementRate() {
return achievementRate;
}
public void setAchievementRate(double achievementRate) {
this.achievementRate = achievementRate;
}
public String getPaceType() {
return paceType;
}
public void setPaceType(String paceType) {
this.paceType = paceType;
}
}StudyPace.javaは、modelパッケージに作成します。
Serializableを実装し、フィールドをprivateにし、各フィールドに対するgetterとsetterを用意しています。これにより、JavaBeansとして扱いやすい形になります。
StudyPace.javaの役割
StudyPace.javaは、学習ペース診断の結果に関する情報をまとめて保持するクラスです。
StudyPaceが持つ情報
| フィールド | 内容 |
|---|---|
| targetMinutes | 目標学習時間 |
| actualMinutes | 実際の学習時間 |
| achievementRate | 達成率 |
| paceType | 学習ペースの判定結果 |
サーブレットでは、フォームから受け取った目標学習時間と実際の学習時間をStudyPaceに設定します。
その後、StudyPaceLogicが達成率と判定結果を計算し、同じStudyPaceインスタンスに設定します。
最後に、StudyPaceインスタンスをリクエストスコープへ保存し、JSPで表示します。
処理を行うモデルを作成する
次に、学習ペース診断に関する処理を行うクラスを作成します。
StudyPaceLogic.javaでは、StudyPaceインスタンスを受け取り、達成率を計算します。その後、達成率に応じて判定結果を設定します。
学習ペース診断に関する処理を行うモデルの例
ファイル名: StudyPaceLogic.java
package model;
public class StudyPaceLogic {
public void execute(StudyPace studyPace) {
// 達成率を算出して設定
int targetMinutes = studyPace.getTargetMinutes();
int actualMinutes = studyPace.getActualMinutes();
double achievementRate =
actualMinutes / (double) targetMinutes * 100;
studyPace.setAchievementRate(achievementRate);
// 達成率から学習ペースを判定して設定
String paceType;
if (achievementRate < 60) {
paceType = "もう少しペースアップ";
} else if (achievementRate < 100) {
paceType = "あと一歩";
} else {
paceType = "目標達成";
}
studyPace.setPaceType(paceType);
}
}StudyPaceLogic.javaもmodelパッケージに作成します。
このクラスは画面表示を行いません。リクエストパラメータを直接取得することもありません。あくまで、学習ペース診断に関する処理を担当します。
StudyPaceLogic.javaの処理内容
StudyPaceLogic.javaのexecuteメソッドには、StudyPaceインスタンスを引数として渡します。
executeメソッドの中では、StudyPaceから目標学習時間と実際の学習時間を取得し、達成率を計算します。
その後、達成率に応じて学習ペースを判定します。
判定処理の流れ
| 順番 | 内容 |
|---|---|
| 1 | StudyPaceから目標学習時間を取得する |
| 2 | StudyPaceから実際の学習時間を取得する |
| 3 | 達成率を計算する |
| 4 | 達成率をStudyPaceに設定する |
| 5 | 達成率に応じて判定結果を決める |
| 6 | 判定結果をStudyPaceに設定する |
executeメソッドに渡されたStudyPaceインスタンスへ達成率と判定結果を設定すると、呼び出し元のサーブレット側でも、その設定後のStudyPaceインスタンスを利用できます。
これは、インスタンスが参照として渡されるためです。
引数で渡したインスタンスの変更
Javaでは、メソッドにインスタンスを引数として渡すと、呼び出し先のメソッドでそのインスタンスの中身を変更できます。
StudyPaceLogicのexecuteメソッドでは、引数として受け取ったStudyPaceインスタンスに対して、setAchievementRateとsetPaceTypeを呼び出しています。
この変更は、呼び出し元であるStudyCheck.java側のStudyPaceインスタンスにも反映されます。
インスタンスを引数で渡した場合
| 場面 | 内容 |
|---|---|
| StudyCheck.java | StudyPaceインスタンスを作成する |
| StudyPaceLogic.java | 引数で受け取ったStudyPaceに結果を設定する |
| StudyCheck.java | 設定後のStudyPaceをリクエストスコープに保存する |
この仕組みにより、StudyPaceLogicが計算した結果を、StudyCheck.java側でもそのまま利用できます。
コントローラを作成する
次に、学習ペース診断に関するリクエストを処理するサーブレットを作成します。
StudyCheck.javaはコントローラです。
GETリクエストを受けた場合は、入力画面であるstudyCheck.jspへフォワードします。
POSTリクエストを受けた場合は、フォームから送られた目標学習時間と実際の学習時間を取得し、StudyPaceインスタンスに設定します。その後、StudyPaceLogicで診断処理を行い、結果をリクエストスコープに保存して、studyCheckResult.jspへフォワードします。
学習ペース診断に関するリクエストを処理するコントローラの例
ファイル名: StudyCheck.java
package servlet;
import java.io.IOException;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import model.StudyPace;
import model.StudyPaceLogic;
@WebServlet("/StudyCheck")
public class StudyCheck extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// フォワード
RequestDispatcher dispatcher =
request.getRequestDispatcher(
"WEB-INF/jsp/studyCheck.jsp");
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// リクエストパラメータを取得
String targetMinutes =
request.getParameter("targetMinutes");
String actualMinutes =
request.getParameter("actualMinutes");
// 入力値をプロパティに設定
StudyPace studyPace = new StudyPace();
studyPace.setTargetMinutes(
Integer.parseInt(targetMinutes));
studyPace.setActualMinutes(
Integer.parseInt(actualMinutes));
// 学習ペース診断を実行し結果を設定
StudyPaceLogic studyPaceLogic = new StudyPaceLogic();
studyPaceLogic.execute(studyPace);
// リクエストスコープに保存
request.setAttribute("studyPace", studyPace);
// フォワード
RequestDispatcher dispatcher =
request.getRequestDispatcher(
"WEB-INF/jsp/studyCheckResult.jsp");
dispatcher.forward(request, response);
}
}StudyCheck.javaはservletパッケージに作成します。
URLパターンは/StudyCheckです。ブラウザからhttp://localhost:8080/study/StudyCheckへアクセスすると、doGetメソッドが実行され、入力画面へフォワードされます。
StudyCheck.javaのdoGetメソッド
doGetメソッドは、入力画面を表示するために使います。
ブラウザのアドレスバーにURLを入力した場合や、戻るリンクをクリックした場合はGETリクエストになります。
StudyCheck.javaのdoGetメソッドでは、studyCheck.jspへフォワードしています。
doGetメソッドの役割
| 処理 | 内容 |
|---|---|
| GETリクエストを受け取る | ブラウザからStudyCheckへアクセスされる |
| RequestDispatcherを取得する | studyCheck.jspへの転送準備をする |
| forwardを実行する | 入力画面を表示するJSPへ処理を移す |
studyCheck.jspはWEB-INF/jspフォルダ内に置いています。
WEB-INFの中にあるJSPは、ブラウザから直接アクセスできません。サーブレットからフォワードして表示します。
StudyCheck.javaのdoPostメソッド
doPostメソッドは、フォーム送信後の処理を担当します。
studyCheck.jspのフォームではmethod属性にpostを指定しているため、診断ボタンをクリックするとPOSTリクエストが送られます。
StudyCheck.javaでは、doPostメソッドでリクエストパラメータを取得します。
doPostメソッドの主な処理
| 順番 | 処理 |
|---|---|
| 1 | targetMinutesとactualMinutesを取得する |
| 2 | StudyPaceインスタンスを作成する |
| 3 | 入力値をint型へ変換して設定する |
| 4 | StudyPaceLogicで診断処理を行う |
| 5 | StudyPaceをリクエストスコープへ保存する |
| 6 | studyCheckResult.jspへフォワードする |
フォームから送られてくる値は文字列です。
そのため、Integer.parseIntを使ってint型に変換してから、StudyPaceに設定しています。
今回はソースコードをシンプルにするため、入力値のチェックは行いません。数値以外を入力すると、実行時エラーが発生し、500ページが表示されます。
リクエストスコープに保存する処理
StudyCheck.javaでは、次の処理でStudyPaceインスタンスをリクエストスコープへ保存しています。
request.setAttribute("studyPace", studyPace);
setAttributeで指定している内容
| 指定 | 内容 |
|---|---|
| studyPace | 属性名 |
| studyPace変数 | 保存するStudyPaceインスタンス |
この処理によって、studyCheckResult.jspでStudyPaceインスタンスを取得できるようになります。
属性名は、保存側と取得側で一致させる必要があります。
サーブレット側でstudyPaceという属性名で保存した場合、JSP側でもstudyPaceという属性名で取得します。
図3:リクエストスコープで結果を渡してJSPに表示する

この図から分かること
フォームから送信された値は、StudyCheck.javaで取得されます。
StudyCheck.javaはStudyPaceインスタンスを作成し、StudyPaceLogicに処理を依頼します。計算結果が設定されたStudyPaceインスタンスは、リクエストスコープに保存されます。
その後、studyCheckResult.jspへフォワードすると、JSP側でリクエストスコープからStudyPaceを取得できます。JSPはgetterを使って達成率や判定結果を取り出し、HTMLとして画面に表示します。
入力画面を作成する
次に、学習ペース診断画面を表示するJSPファイルを作成します。
studyCheck.jspは、WEB-INF/jspフォルダに作成します。
このJSPでは、目標学習時間と実際の学習時間を入力するフォームを表示します。送信先はStudyCheck、送信方法はpostです。
学習ペース診断画面を出力するビューの例
ファイル名: studyCheck.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>
<h1>学習ペース診断</h1>
<form action="StudyCheck" method="post">
目標学習時間:<input type="text" name="targetMinutes">分<br>
実際の学習時間:<input type="text" name="actualMinutes">分<br>
<input type="submit" value="診断">
</form>
</body>
</html>このJSPファイルは入力画面を表示するビューです。
ユーザーが入力した値は、診断ボタンをクリックするとStudyCheckへPOST送信されます。
studyCheck.jspのポイント
studyCheck.jspでは、formタグの設定とinputタグのname属性が重要です。
フォームの設定
| 記述 | 役割 |
|---|---|
| action="StudyCheck" | 送信先をStudyCheckサーブレットにする |
| method="post" | POSTリクエストで送信する |
| name="targetMinutes" | 目標学習時間の識別名 |
| name="actualMinutes" | 実際の学習時間の識別名 |
サーブレット側では、request.getParameter("targetMinutes")とrequest.getParameter("actualMinutes")で値を取得します。
そのため、JSP側のname属性と、サーブレット側のgetParameterの引数を一致させる必要があります。
結果画面を作成する
最後に、学習ペース診断結果画面を表示するJSPファイルを作成します。
studyCheckResult.jspでは、リクエストスコープに保存されたStudyPaceインスタンスを取得し、そのプロパティの値を表示します。
JSPでStudyPace型を使うため、pageディレクティブでmodel.StudyPaceをインポートします。
学習ペース診断結果画面を出力するビューの例
studyCheckResult.jspは、WEB-INF/jspフォルダに作成します。
ファイル名: studyCheckResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ page import="model.StudyPace" %>
<%
// リクエストスコープに保存されたStudyPaceインスタンスを取得
StudyPace studyPace =
(StudyPace) request.getAttribute("studyPace");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学習ペース診断</title>
</head>
<body>
<h1>学習ペース診断の結果</h1>
<p>
目標学習時間:<%= studyPace.getTargetMinutes() %>分<br>
実際の学習時間:<%= studyPace.getActualMinutes() %>分<br>
達成率:<%= studyPace.getAchievementRate() %>%<br>
判定:<%= studyPace.getPaceType() %>
</p>
<a href="StudyCheck">戻る</a>
</body>
</html>このJSPでは、request.getAttribute("studyPace")でリクエストスコープからStudyPaceインスタンスを取得しています。
getAttributeの戻り値はObject型なので、StudyPace型にキャストしています。
その後、getterを使って目標学習時間、実際の学習時間、達成率、判定結果を表示しています。
studyCheckResult.jspのポイント
studyCheckResult.jspで大切なのは、リクエストスコープからStudyPaceを取得する部分です。
リクエストスコープからの取得
| 処理 | 内容 |
|---|---|
| page import="model.StudyPace" | StudyPace型をJSPで使えるようにする |
| request.getAttribute("studyPace") | リクエストスコープからインスタンスを取得する |
| (StudyPace) | Object型からStudyPace型へキャストする |
| getter | StudyPaceのプロパティを表示する |
保存時の属性名と取得時の属性名は一致させます。
StudyCheck.javaでrequest.setAttribute("studyPace", studyPace)として保存しているため、studyCheckResult.jspでもrequest.getAttribute("studyPace")と指定します。
プログラムを実行する
5つのファイルを作成したら、StudyCheck.javaを実行して動作を確認します。
実行する方法は2つあります。
実行方法
| 方法 | 内容 |
|---|---|
| 方法① | ブラウザのアドレスバーにURLを入力してリクエストする |
| 方法② | Eclipseの実行機能でStudyCheck.javaを実行する |
ブラウザから実行する場合は、次のURLへアクセスします。
StudyCheckへGETリクエストが送られると、doGetメソッドが実行され、studyCheck.jspへフォワードされます。
入力画面が表示されたら、目標学習時間と実際の学習時間を入力し、診断ボタンをクリックします。
ブラウザの表示例

動作確認の例
| 入力項目 | 入力例 |
|---|---|
| 目標学習時間 | 120 |
| 実際の学習時間 | 90 |
この場合、達成率は75.0%になり、判定はあと一歩になります。
ブラウザの表示例

入力値チェックは行っていない
今回のプログラムでは、ソースコードをシンプルにするため、入力値のチェックは行っていません。
そのため、目標学習時間や実際の学習時間に数値以外を入力すると、Integer.parseIntで変換できず、実行時エラーが発生します。
その結果、500ページが表示されます。
エラーになりやすい入力例
| 入力内容 | 起こること |
|---|---|
| 空欄 | 数値に変換できずエラーになる |
| あいうえお | 数値に変換できずエラーになる |
| 12分 | 数字以外を含むためエラーになる |
今回は、リクエストスコープとMVCモデルの流れを理解することが目的です。
入力値チェックは扱わず、まずは正しい数値を入力して動作を確認しましょう。
WEB-INF内のJSPは直接実行しない
今回のstudyCheck.jspとstudyCheckResult.jspは、WEB-INF/jspフォルダに配置しています。
WEB-INF内のJSPファイルは、ブラウザから直接リクエストできません。
そのため、次のようにJSPファイルへ直接アクセスするのではなく、StudyCheckサーブレットを通して表示します。
実行の考え方
| 対象 | 実行方法 |
|---|---|
| StudyCheck.java | ブラウザまたはEclipseから実行する |
| studyCheck.jsp | StudyCheckのdoGetからフォワードされる |
| studyCheckResult.jsp | StudyCheckのdoPostからフォワードされる |
最初にアクセスする入口はStudyCheckです。
JSPは、サーブレットからフォワードされて表示されるビューとして扱います。
MVCモデルと分業
MVCモデルは、役割を分けて開発する場面で力を発揮します。
実際の開発現場では、すべてのファイルを1人で作るとは限りません。処理を担当する人、画面を担当する人、リクエスト制御を担当する人が分かれることがあります。
今回のアプリケーションでも、役割を分けて考えられます。
分業しやすい構成
| 担当 | 主に見るファイル | 必要な知識 |
|---|---|---|
| モデル担当 | StudyPace.java、StudyPaceLogic.java | Javaのクラス、計算処理 |
| ビュー担当 | studyCheck.jsp、studyCheckResult.jsp | HTML、JSPの表示 |
| コントローラ担当 | StudyCheck.java | サーブレット、リクエスト、フォワード |
モデル担当は、Webアプリケーション全体の細かい知識がなくても、計算処理に集中できます。
ビュー担当は、HTMLや画面表示を中心に作業できます。
コントローラ担当は、リクエストを受け取り、モデルとビューをつなぐ流れを作ります。
このように、MVCモデルは手分けして開発しやすい構造です。
リクエストスコープでできないこと
リクエストスコープは便利ですが、何でもできるわけではありません。
リクエストスコープの正体であるHttpServletRequestインスタンスは、レスポンスがブラウザへ返されると役目を終えます。
それに伴って、リクエストスコープに保存していたインスタンスも利用できなくなります。
つまり、リクエストスコープに保存したインスタンスは、次回のリクエストでは取得できません。
リクエストスコープの限界
| できること | できないこと |
|---|---|
| 1回のリクエスト内でサーブレットからJSPへ渡す | リクエストをまたいで共有する |
| フォワード先でインスタンスを取得する | 次回アクセス時に同じインスタンスを取得する |
| 結果表示用の一時的なデータを渡す | ログイン情報やカート情報を長く保持する |
ショッピングカートの情報やログイン情報のように、複数のリクエストをまたいで保持したいデータは、リクエストスコープでは扱えません。
そのような場合は、別の種類のスコープを使います。
リダイレクト先とは共有できない
リクエストスコープは、フォワードとは相性がよいスコープです。
フォワードでは、ブラウザへレスポンスを返す前に、サーバ内部で処理を別のJSPへ移します。そのため、同じリクエストの中でリクエストスコープを利用できます。
一方、リダイレクトでは、いったんブラウザへレスポンスを返し、ブラウザが別のURLへ再リクエストします。
この時点で新しいリクエストになるため、リダイレクト元でリクエストスコープに保存したインスタンスは、リダイレクト先では取得できません。
フォワードとリダイレクトでの違い
| 転送方法 | リクエストスコープの扱い |
|---|---|
| フォワード | 同じリクエスト内なので共有できる |
| リダイレクト | 新しいリクエストになるので共有できない |
リクエストスコープに保存したStudyPaceをJSPで表示したい場合は、リダイレクトではなくフォワードを使います。
リクエストスコープの寿命
リクエストスコープの内容は、HTTPレスポンスがブラウザへ返るまで利用できます。
レスポンスが返されたあとは、リクエストスコープに保存していたインスタンスは消えてしまいます。
リクエストスコープの寿命
| タイミング | リクエストスコープ |
|---|---|
| リクエスト開始 | 利用できる |
| サーブレット処理中 | 利用できる |
| JSPへフォワード中 | 利用できる |
| レスポンス返却後 | 利用できない |
| 次回リクエスト | 前回の内容は残っていない |
この性質を理解しておくと、どのデータをリクエストスコープに保存すべきか判断しやすくなります。
結果表示に一時的に使うデータはリクエストスコープに向いています。しかし、長く保持したいデータには向いていません。
リクエストスコープを使ったWebアプリで確認したいこと
今回のアプリケーションでは、MVCモデルとリクエストスコープが組み合わさっています。
動作しない場合は、次の点を確認しましょう。
| 確認項目 | 内容 |
|---|---|
| URLパターン | @WebServlet("/StudyCheck")になっているか |
| 実行URL | http://localhost:8080/study/StudyCheckになっているか |
| JSPの保存場所 | WEB-INF/jspに配置しているか |
| フォームのaction属性 | StudyCheckになっているか |
| フォームのmethod属性 | postになっているか |
| name属性 | targetMinutes、actualMinutesになっているか |
| getParameter | targetMinutes、actualMinutesを指定しているか |
| JavaBeans | StudyPaceがmodelパッケージにあるか |
| ロジッククラス | StudyPaceLogicで達成率と判定を設定しているか |
| setAttribute | studyPaceという属性名で保存しているか |
| getAttribute | studyPaceという属性名で取得しているか |
| import | studyCheckResult.jspでmodel.StudyPaceをインポートしているか |
| 転送方法 | 結果画面へフォワードしているか |
リクエストスコープを使ったWebアプリケーションでは、サーブレット、モデル、JSPの対応関係をそろえることが重要です。
サーブレットで処理結果を作成し、リクエストスコープに保存し、JSPへフォワードし、JSPで取得して表示する。この流れを意識しながらコードを確認すると、MVCモデルとリクエストスコープのつながりが理解しやすくなります。
