サーブレット&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の要素今回の担当内容
ModelStudyPace.java
StudyPaceLogic.java
データ保持と計算処理を担当する
ViewstudyCheck.jsp
studyCheckResult.jsp
入力画面と結果画面を表示する
ControllerStudyCheck.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リクエストを送る
2StudyCheckのdoGetメソッドが実行される
3studyCheck.jspへフォワードする
4ブラウザに学習ペース診断画面が表示される

結果画面を表示する流れ

順番内容
1診断ボタンをクリックしてPOSTリクエストを送る
2StudyCheckのdoPostメソッドが実行される
3リクエストパラメータを取得する
4StudyPaceインスタンスに入力値を設定する
5StudyPaceLogicで達成率と判定結果を設定する
6StudyPaceインスタンスをリクエストスコープに保存する
7studyCheckResult.jspへフォワードする
8JSPがリクエストスコープから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から目標学習時間と実際の学習時間を取得し、達成率を計算します。

その後、達成率に応じて学習ペースを判定します。

判定処理の流れ

順番内容
1StudyPaceから目標学習時間を取得する
2StudyPaceから実際の学習時間を取得する
3達成率を計算する
4達成率をStudyPaceに設定する
5達成率に応じて判定結果を決める
6判定結果をStudyPaceに設定する

executeメソッドに渡されたStudyPaceインスタンスへ達成率と判定結果を設定すると、呼び出し元のサーブレット側でも、その設定後のStudyPaceインスタンスを利用できます。

これは、インスタンスが参照として渡されるためです。

引数で渡したインスタンスの変更

Javaでは、メソッドにインスタンスを引数として渡すと、呼び出し先のメソッドでそのインスタンスの中身を変更できます。

StudyPaceLogicのexecuteメソッドでは、引数として受け取ったStudyPaceインスタンスに対して、setAchievementRateとsetPaceTypeを呼び出しています。

この変更は、呼び出し元であるStudyCheck.java側のStudyPaceインスタンスにも反映されます。

インスタンスを引数で渡した場合

場面内容
StudyCheck.javaStudyPaceインスタンスを作成する
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メソッドの主な処理

順番処理
1targetMinutesとactualMinutesを取得する
2StudyPaceインスタンスを作成する
3入力値をint型へ変換して設定する
4StudyPaceLogicで診断処理を行う
5StudyPaceをリクエストスコープへ保存する
6studyCheckResult.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型へキャストする
getterStudyPaceのプロパティを表示する

保存時の属性名と取得時の属性名は一致させます。

StudyCheck.javaでrequest.setAttribute("studyPace", studyPace)として保存しているため、studyCheckResult.jspでもrequest.getAttribute("studyPace")と指定します。

プログラムを実行する

5つのファイルを作成したら、StudyCheck.javaを実行して動作を確認します。

実行する方法は2つあります。

実行方法

方法内容
方法①ブラウザのアドレスバーにURLを入力してリクエストする
方法②Eclipseの実行機能でStudyCheck.javaを実行する

ブラウザから実行する場合は、次のURLへアクセスします。

http://localhost:8080/study/StudyCheck

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.jspStudyCheckのdoGetからフォワードされる
studyCheckResult.jspStudyCheckのdoPostからフォワードされる

最初にアクセスする入口はStudyCheckです。

JSPは、サーブレットからフォワードされて表示されるビューとして扱います。

MVCモデルと分業

MVCモデルは、役割を分けて開発する場面で力を発揮します。

実際の開発現場では、すべてのファイルを1人で作るとは限りません。処理を担当する人、画面を担当する人、リクエスト制御を担当する人が分かれることがあります。

今回のアプリケーションでも、役割を分けて考えられます。

分業しやすい構成

担当主に見るファイル必要な知識
モデル担当StudyPace.java、StudyPaceLogic.javaJavaのクラス、計算処理
ビュー担当studyCheck.jsp、studyCheckResult.jspHTML、JSPの表示
コントローラ担当StudyCheck.javaサーブレット、リクエスト、フォワード

モデル担当は、Webアプリケーション全体の細かい知識がなくても、計算処理に集中できます。

ビュー担当は、HTMLや画面表示を中心に作業できます。

コントローラ担当は、リクエストを受け取り、モデルとビューをつなぐ流れを作ります。

このように、MVCモデルは手分けして開発しやすい構造です。

リクエストスコープでできないこと

リクエストスコープは便利ですが、何でもできるわけではありません。

リクエストスコープの正体であるHttpServletRequestインスタンスは、レスポンスがブラウザへ返されると役目を終えます。

それに伴って、リクエストスコープに保存していたインスタンスも利用できなくなります。

つまり、リクエストスコープに保存したインスタンスは、次回のリクエストでは取得できません。

リクエストスコープの限界

できることできないこと
1回のリクエスト内でサーブレットからJSPへ渡すリクエストをまたいで共有する
フォワード先でインスタンスを取得する次回アクセス時に同じインスタンスを取得する
結果表示用の一時的なデータを渡すログイン情報やカート情報を長く保持する

ショッピングカートの情報やログイン情報のように、複数のリクエストをまたいで保持したいデータは、リクエストスコープでは扱えません。

そのような場合は、別の種類のスコープを使います。

リダイレクト先とは共有できない

リクエストスコープは、フォワードとは相性がよいスコープです。

フォワードでは、ブラウザへレスポンスを返す前に、サーバ内部で処理を別のJSPへ移します。そのため、同じリクエストの中でリクエストスコープを利用できます。

一方、リダイレクトでは、いったんブラウザへレスポンスを返し、ブラウザが別のURLへ再リクエストします。

この時点で新しいリクエストになるため、リダイレクト元でリクエストスコープに保存したインスタンスは、リダイレクト先では取得できません。

フォワードとリダイレクトでの違い

転送方法リクエストスコープの扱い
フォワード同じリクエスト内なので共有できる
リダイレクト新しいリクエストになるので共有できない

リクエストスコープに保存したStudyPaceをJSPで表示したい場合は、リダイレクトではなくフォワードを使います。

リクエストスコープの寿命

リクエストスコープの内容は、HTTPレスポンスがブラウザへ返るまで利用できます。

レスポンスが返されたあとは、リクエストスコープに保存していたインスタンスは消えてしまいます。

リクエストスコープの寿命

タイミングリクエストスコープ
リクエスト開始利用できる
サーブレット処理中利用できる
JSPへフォワード中利用できる
レスポンス返却後利用できない
次回リクエスト前回の内容は残っていない

この性質を理解しておくと、どのデータをリクエストスコープに保存すべきか判断しやすくなります。

結果表示に一時的に使うデータはリクエストスコープに向いています。しかし、長く保持したいデータには向いていません。

リクエストスコープを使ったWebアプリで確認したいこと

今回のアプリケーションでは、MVCモデルとリクエストスコープが組み合わさっています。

動作しない場合は、次の点を確認しましょう。

確認項目内容
URLパターン@WebServlet("/StudyCheck")になっているか
実行URLhttp://localhost:8080/study/StudyCheckになっているか
JSPの保存場所WEB-INF/jspに配置しているか
フォームのaction属性StudyCheckになっているか
フォームのmethod属性postになっているか
name属性targetMinutes、actualMinutesになっているか
getParametertargetMinutes、actualMinutesを指定しているか
JavaBeansStudyPaceがmodelパッケージにあるか
ロジッククラスStudyPaceLogicで達成率と判定を設定しているか
setAttributestudyPaceという属性名で保存しているか
getAttributestudyPaceという属性名で取得しているか
importstudyCheckResult.jspでmodel.StudyPaceをインポートしているか
転送方法結果画面へフォワードしているか

リクエストスコープを使ったWebアプリケーションでは、サーブレット、モデル、JSPの対応関係をそろえることが重要です。

サーブレットで処理結果を作成し、リクエストスコープに保存し、JSPへフォワードし、JSPで取得して表示する。この流れを意識しながらコードを確認すると、MVCモデルとリクエストスコープのつながりが理解しやすくなります。