サーブレットからJSPへ値を渡す方法を完全解説!RequestDispatcherで画面遷移を理解しよう
新人
「サーブレットからJSPに画面を切り替えるとき、どうやってデータを渡すんですか?」
先輩
「サーブレットでは、RequestDispatcherを使うことで、JSPに画面遷移しながら値を渡せます。」
新人
「RequestDispatcherって、そもそも何をする仕組みなんですか?」
先輩
「サーブレットで処理した結果を、そのままJSPに引き継ぐための仕組みです。順番に見ていきましょう。」
1. サーブレットからJSPへ値を渡すとは?(RequestDispatcherの基本概念)
JavaのWeb開発では、サーブレットとJSPを組み合わせて使うのが一般的です。 サーブレットは、ユーザーからのリクエストを受け取り、計算や条件分岐などの処理を担当します。 一方でJSPは、画面に文字や表を表示する役割を持っています。
サーブレットからJSPへ値を渡すとは、サーブレット側で用意したデータを、 JSP側でそのまま表示できるように引き継ぐことを意味します。 このときに使われるのが RequestDispatcher です。
RequestDispatcherとは、「このリクエストを、別の画面に引き渡してください」と サーバー内部で指示を出すための仕組みです。 ブラウザから見るとURLは変わらず、サーバーの中だけで画面が切り替わる点が大きな特徴です。
パソコンを触ったことがない人向けに例えると、 サーブレットは受付係、JSPは案内板のような存在です。 受付係が「この情報を表示してね」とメモを渡し、 そのメモを見て案内板が内容を表示するイメージです。
2. JSPとサーブレットを連携させる必要性と利用シーン
なぜJSPとサーブレットを分けて使う必要があるのでしょうか。 それは、役割を分担することで、プログラムが分かりやすくなり、 修正や管理がしやすくなるからです。
例えば、ログイン画面を考えてみてください。 ユーザーが入力したIDやパスワードをチェックする処理はサーブレットで行い、 「ログイン成功」「ログイン失敗」といった結果表示はJSPで行います。
このとき、サーブレットで判定した結果をJSPへ渡さなければ、 正しいメッセージを表示することができません。 そこでRequestDispatcherを使い、判定結果という値をJSPへ渡します。
検索結果一覧、入力内容の確認画面、エラーメッセージ表示など、 サーブレットとJSPの連携は、ほぼすべてのWebアプリケーションで使われています。 初心者のうちから、この流れを理解しておくことがとても大切です。
3. RequestDispatcherを使った画面遷移の基本的な流れ
RequestDispatcherを使った画面遷移は、大きく分けて三つの流れで構成されています。 まずサーブレットでリクエストを受け取り、次に値をセットし、 最後にJSPへ転送します。
値をセットするとは、リクエストに対して「この名前でこのデータを持たせる」 という操作を行うことです。 この操作により、JSP側で同じ名前を指定すれば、その値を取り出せます。
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;
@WebServlet("/sample")
public class SampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String message = "サーブレットから渡されたメッセージです";
request.setAttribute("msg", message);
RequestDispatcher dispatcher =
request.getRequestDispatcher("/sample.jsp");
dispatcher.forward(request, response);
}
}
上記の例では、サーブレットで文字列を用意し、 setAttributeを使ってリクエストに保存しています。 その後、RequestDispatcherでJSPへ処理を引き渡しています。
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>サンプルJSP</title>
</head>
<body>
<p>${msg}</p>
</body>
</html>
JSP側では、サーブレットで設定した名前を使って値を表示します。 このように、RequestDispatcherを使えば、 サーブレットの処理結果を安全にJSPへ渡すことができます。
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName = request.getParameter("name");
request.setAttribute("user", userName);
request.getRequestDispatcher("/result.jsp")
.forward(request, response);
}
こちらはフォーム入力を受け取る別パターンの例です。 ユーザーが入力した値をそのままJSPへ渡し、 表示専用の画面で利用する流れになります。 実務でも頻繁に使われる基本形なので、必ず覚えておきましょう。
4. requestスコープを使った値の受け渡し方法
サーブレットからJSPへ値を渡す際に、最も基本となる考え方がrequestスコープです。 requestスコープとは、一回のリクエストが処理されている間だけ有効な保存領域のことを指します。 ブラウザから送信されたリクエストがサーバーに届き、最終的にレスポンスが返されるまでの短い時間だけ存在します。
このスコープを使う最大のメリットは、必要なデータを必要な画面にだけ渡せる点です。 一時的な検索結果や入力内容の確認データなど、処理が終われば不要になる情報を扱うのに最適です。 セッションのように長時間残ることがないため、データ管理がシンプルになります。
requestスコープへ値を保存するには、setAttributeというメソッドを利用します。 名前と値をセットすることで、同じリクエスト内であれば、どこからでも取り出せるようになります。 この「同じリクエスト内」という点がとても重要です。
requestスコープは、RequestDispatcherのforwardと組み合わせて使われるのが基本形です。 forwardを使うことで、リクエスト情報がそのまま次のJSPへ引き継がれます。 その結果、サーブレットで設定した属性を、JSP側で問題なく参照できます。
逆に言えば、redirectを使った場合はrequestスコープの値は失われます。 新しいリクエストが発生するため、別のスコープを使わない限り、データは引き継がれません。 初心者がつまずきやすいポイントなので、ここはしっかり意識しておきましょう。
@WebServlet("/requestSample")
public class RequestSampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("title", "requestスコープのサンプル");
request.setAttribute("count", 5);
RequestDispatcher dispatcher =
request.getRequestDispatcher("/request.jsp");
dispatcher.forward(request, response);
}
}
この例では、文字列と数値をrequestスコープに保存しています。 複数の値を同時にセットできるため、画面表示に必要な情報をまとめてJSPへ渡すことができます。 実務では、一覧データやメッセージ、判定結果などをまとめて渡すケースが多く見られます。
5. RequestDispatcherのforwardメソッドの使い方と実装例
RequestDispatcherの中でも、特に重要なのがforwardメソッドです。 forwardは、サーバー内部で処理を別のリソースへ引き継ぐための仕組みです。 ブラウザから見ると画面が切り替わったように見えますが、実際には同じリクエストが使われ続けています。
この仕組みにより、サーブレットで行った処理結果を、そのままJSPで利用できます。 URLが変わらないため、不要な再リクエストを防げる点もメリットです。 フォームの入力確認画面や結果表示画面で多用されます。
forwardを使う際の基本的な流れは、パスを指定してRequestDispatcherを取得し、 forwardメソッドにrequestとresponseを渡すだけです。 処理自体は非常にシンプルですが、役割はとても重要です。
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String result;
int score = Integer.parseInt(request.getParameter("score"));
if (score >= 80) {
result = "合格";
} else {
result = "不合格";
}
request.setAttribute("result", result);
request.getRequestDispatcher("/judge.jsp")
.forward(request, response);
}
このサンプルでは、点数を判定し、その結果をrequestスコープに保存しています。 JSP側では、判定結果だけを表示するため、画面処理が非常に分かりやすくなります。 ロジックと表示を分離するという、Web開発の基本的な考え方が自然と身につきます。
なお、forwardを呼び出した後は、サーブレット側でレスポンスを書き込んではいけません。 処理はJSPへ完全に引き継がれるため、二重出力の原因になります。 この点も実務でよくあるミスなので注意が必要です。
6. JSP側で値を受け取って表示する仕組みの理解ポイント
サーブレットから渡された値は、JSP側で正しく受け取って表示する必要があります。 現在の主流は、JSP式言語を使ったシンプルな記述方法です。 これにより、Javaコードをほとんど書かずに値を扱えます。
JSPでは、requestスコープに保存された値を、属性名で指定するだけで参照できます。 サーブレットで設定した名前と、JSPで指定する名前が一致していることが重要です。 名前が違うと、値は取得できません。
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>判定結果</title>
</head>
<body>
<h3>結果:${result}</h3>
</body>
</html>
このように、${ }で囲むだけで、requestスコープの値を表示できます。 初心者でも直感的に理解しやすく、可読性も高い書き方です。 表示処理に専念できるため、JSP本来の役割を果たせます。
また、数値や文字列だけでなく、オブジェクトを渡すことも可能です。 その場合は、JSP側でプロパティを指定して表示します。 一覧画面や詳細画面の作成で頻繁に使われるテクニックです。
JSP側での受け取りを理解することで、サーブレットとJSPの連携が一気に分かりやすくなります。 どこで値を作り、どこで表示するのかを意識することが、保守性の高いWebアプリを作る第一歩です。
7. RequestDispatcherで値を渡すメリットと実務での活用例
RequestDispatcherを使って値を渡す最大のメリットは、サーブレットで処理した結果を、 そのまま安全にJSPへ引き継げる点にあります。 同じリクエストを共有して画面遷移が行われるため、余計な通信や再処理が発生しません。 この特性は、ユーザー体験とシステム効率の両面で非常に重要です。
実務の現場では、入力内容の確認画面や、検索結果の表示、エラー内容の通知など、 一時的な情報を画面に表示するケースが多く存在します。 そのような場面では、requestスコープとRequestDispatcherの組み合わせが最適です。 必要なデータだけを次の画面に渡し、処理が終われば自然に破棄されるため、 データ管理が複雑になりません。
例えば、会員登録処理を考えてみましょう。 入力チェックをサーブレットで行い、問題がなければ確認画面へ、 エラーがあれば入力画面へ戻すといった流れが一般的です。 このとき、エラーメッセージや入力内容をrequestスコープに保存し、 RequestDispatcherで画面を切り替えることで、ユーザーに分かりやすい画面表示が可能になります。
また、検索機能でもよく使われます。 検索条件を受け取り、データベースから取得した一覧結果をrequestスコープに格納し、 JSPで表形式に表示するという構成は、多くのWebシステムで採用されています。 サーブレットは処理に集中し、JSPは表示に専念するという役割分担が明確になる点も、 RequestDispatcherを使う大きな利点です。
さらに、URLが変わらないという点も見逃せません。 ブラウザのアドレスバーに処理用のURLが表示されないため、 内部構造をユーザーに意識させず、セキュリティ面でも安心感があります。 このように、RequestDispatcherは初心者向けの仕組みでありながら、 実務でも長く使われ続けている重要な技術です。
@WebServlet("/search")
public class SearchServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String keyword = request.getParameter("keyword");
request.setAttribute("keyword", keyword);
request.setAttribute("resultCount", 10);
request.getRequestDispatcher("/searchResult.jsp")
.forward(request, response);
}
}
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>検索結果</title>
</head>
<body>
<p>検索キーワード:${keyword}</p>
<p>検索結果件数:${resultCount} 件</p>
</body>
</html>
8. 値が渡らないときの原因とよくあるミス
RequestDispatcherを使っているにもかかわらず、JSPで値が表示されないというトラブルは、 初心者が最も悩みやすいポイントの一つです。 しかし、その原因の多くは、いくつかの典型的なミスに集約されます。 事前にパターンを知っておくことで、無駄な時間を減らすことができます。
最も多い原因は、属性名の不一致です。 サーブレットで設定した名前と、JSPで参照している名前が少しでも違うと、 値は取得できません。 大文字と小文字の違いも区別されるため、正確に一致させる必要があります。
次に多いのが、redirectを使ってしまっているケースです。 forwardと違い、redirectは新しいリクエストを発生させるため、 requestスコープの値は引き継がれません。 画面遷移しているように見えても、内部の仕組みはまったく異なるため注意が必要です。
また、forwardの前にレスポンスへ出力してしまうミスもよく見られます。 一度でもレスポンスが確定すると、forwardは正常に動作しません。 デバッグ用の出力文が原因になることもあるため、 画面に何も表示されない場合は、処理順を確認してみましょう。
JSP側の記述ミスも見逃せません。 JSP式言語を使う場合、${ }の書き方が間違っていると、 値がそのまま表示されなかったり、空白になったりします。 Javaコードを書かない分、構文ミスに気付きにくい点が特徴です。
このようなトラブルに遭遇した場合は、 「スコープ」「属性名」「画面遷移方法」の三点を順番に確認することが重要です。 原因を一つずつ切り分けることで、落ち着いて解決できるようになります。
request.setAttribute("message", "エラーが発生しました");
response.sendRedirect("/error.jsp");
request.setAttribute("message", "エラーが発生しました");
request.getRequestDispatcher("/error.jsp")
.forward(request, response);
上の例では、最初のコードは値が渡りませんが、 下のコードでは正しくJSPへ値が渡ります。 違いを意識して書けるようになることが、安定した実装への近道です。
9. サーブレットとJSP連携で押さえるべき重要ポイント整理
ここまで見てきたように、サーブレットとJSPの連携では、 それぞれの役割を明確に分けることが最も重要です。 サーブレットは処理担当、JSPは表示担当という基本を守ることで、 コードの見通しが良くなり、保守性も高まります。
RequestDispatcherを使った値の受け渡しは、 この役割分担を自然に実現するための仕組みです。 処理結果をrequestスコープに保存し、forwardで画面を切り替える。 この流れを理解しておけば、多くのWebアプリケーションに応用できます。
また、スコープの使い分けを意識することも大切です。 一回の画面表示だけで使うデータはrequestスコープ、 複数画面で共有したいデータはセッションスコープといったように、 目的に応じて選択することで、不要なトラブルを防げます。
JSP側では、できるだけJavaコードを書かず、 JSP式言語を使ってシンプルに表示することを心がけましょう。 ロジックが増えすぎると、画面の修正が難しくなり、 バグの温床になる可能性があります。
初心者のうちは、値が表示されるかどうかだけに注目しがちですが、 実務では「なぜこの構成なのか」を説明できることが求められます。 RequestDispatcherとrequestスコープの仕組みを理解することで、 設計の意図が見えるようになり、より一段上の開発者に近づけます。
サーブレットとJSPの連携は、Java Web開発の基礎でありながら、 多くの現場で今も使われ続けている重要なテーマです。 今回の内容をしっかり身につけておけば、 次のステップとしてセッション管理や認証処理にもスムーズに進めるでしょう。