2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Servlet/JSPの画面遷移[Java]

Last updated at Posted at 2025-10-11

はじめに

こんにちは。
プログラミング初心者wakinozaと申します。
Java勉強中に調べたことを記事にまとめています。

十分気をつけて執筆していますが、なにぶん初心者が書いた記事なので、理解が浅い点などあるかと思います。
間違い等あれば、指摘いただけると助かります。

記事を参考にされる方は、初心者の記事であることを念頭において、お読みいただけると幸いです。

対象読者

  • Javaを勉強中の方
  • Servlet/JSPについて知りたい方

動作環境

  • MacBook(Intel CPU 搭載)
  • Oracle Java 21
  • eclipse 2023
  • Tomcat 10

記事のテーマ

  • 現在、Javaのサーバサイドの技術であるServlet/JSPについて勉強しています
  • 備忘録として勉強したことをまとめています

目次

1. Servlet/JSPとは
2. フォワード
3. リダイレクト
4. インクルード

本文

1. Servlet/JSPとは

この節ではまず、前提知識として、Webページの閲覧の仕組み、静的なページと動的なページ、サーブレットとJSPについて説明していきます。

1.1. Webページの閲覧の仕組み

インターネットを通じてWebページを閲覧する際は、「ブラウザ」と「Webサーバ」というソフトウェアが動いています。

ブラウザは、Webページの情報を取得し、画面に表示するソフトウェアです。ブラウザの例としては、Chrome、Safari、Edgeなどがあります。

一方のWebサーバは、Webページのデータを管理しており、ブラウザから要求を受けるとネットワークを通じてデータを提供します。Webサーバの例としては、Apache、Nginx、IISなどの製品があります。

私たちがWebページを閲覧しようとブラウザを操作すると、ブラウザはネットワークを通じてWebサーバにWebページのデータを要求します。この要求のことを「リクエスト」と呼びます。
Webサーバはリクエストを受け取ると要求されたデータをネットワークを通じてブラウザに送信します。この応答のことを「レスポンス」と呼びます。

リクエストとレスポンスは、HTTP(Hyper Text Transfer Protocol)という通信プロトコルに基づいています。通信プロトコルとは、ネットワーク上で通信を成立させるための共通の取り決めのことです。

この通信プロトコルは、例えるなら交通ルールのようなものです。もし交通ルールがなく、車が自由に走行して良いとなれば、すぐに大渋滞や事故が起き、誰も安全に車を運転できなくなるでしょう。車線は左、信号を守るといったルールを皆が順守するからこそ、事故や渋滞を極力避け、安全に車を利用することができます。

これと同様に、複数のコンピューターやソフトウェアが共通の通信プロトコルを使用することで、互いの間でスムーズかつ確実に情報交換を行うことができるのです。

1.2. 静的なWebページと動的なWebページ

Webページは、レスポンスとして返すHTMLの生成方法により、「静的なWebページ」と「動的なWebページ」の2つに分類することができます。

「静的なページ」とは、ユーザーの違いやユーザーの操作によって内容が変化しないページのことです。例えば、ニュースサイトに掲載された記事のページや、会社の紹介ページなどは静的なWebページです。
静的なWebページでは、WebサーバにはWebページのデータとしてHTMLファイルが配置されています。ブラウザがWebページをリクエストすると、Webサーバは配置されているHTMLファイルを、そのままレスポンスとしてブラウザに返します。HTMLファイルの内容は固定であるため、同じWebページをリクエストすると、常に同じ内容が表示されるのです。

一方、動的なWebページとは、ユーザーの操作によって内容が変化するページのことです。例えば、検索サイトが表示する検索結果のページやショッピングサイトのカートのページなどは動的Webページです。
ユーザーの操作に対応する全ての静的なWebページをあらかじめ作成しておくのは、無数のパターンが存在するため、現実的ではありません。そのため、動的なWebページでは、ユーザーの操作に応じて、その場で新しいWebページを生成する仕組みが用意されています。

この仕組みの実現には、サーバサイドで処理を実行するプログラムが必要です。
まず、リクエストを受け取ったWebサーバが、サーバサイドに設置されたプログラムを実行します。
この次に、サーバサイドプログラムが、リクエストに含まれるデータを受け取り、HTMLファイルをその場で生成します。
最後に、Webサーバが、生成されたHTMLファイルを、レスポンスとしてブラウザに返します。

このように、動的なWebページを生成する仕組みを「Webアプリケーション」と呼びます。

1.3. ServletとJSP

動的なWebページを生成するには、Webサーバの他に、Webコンテナと呼ばれるソフトウェアが必要です。
Webサーバは、リクエストを受け付けて静的なページのデータを返すことができますが、動的なページを作成することはできません。
そのため、サーブレットの実行環境を提供し、動的なページのデータを生成するためのWebコンテナが必要となるのです。

Webサーバの機能とWebコンテナの機能を両方備えたソフトウェアを、「アプリケーションサーバ」と呼びます。

Java言語において、アプリケーションサーバで処理を実行する仕組みが、「サーブレット」と「JSP(Jakarta Server Pages)」です。

サーブレットとJSPは、「Jakarta EE」という仕様に従ってプログラムを記述します。
Jakarta EEは、主にサーバサイドプログラムを記述するための機能を提供する仕様です。

WebコンテナがJSPを実行すると、JSPファイルからサーブレットのプログラムを生成し、それをコンパイルしてサーブレットとして実行します。つまり、サーブレットとJSPはどちらも最終的にはサーブレットとなり、同様の働きを行うのです。
このようにサーブレットとJSPファイルは同様の働きをするにもかかわらず、2種類の技術が用意されているのはなぜなのでしょう。
その理由は、プログラムの記述方法にあります。

サーブレットは、Javaプログラムの中にHTMLが埋め込まれたような構造になっています。
一方のJSPは、HTMLの中にJavaプログラムが埋め込まれたような構造になっています。
そのため、Java言語が主体でHTMLのコードが少ないクラスはサーブレットが向いていて、HTMLが主体でJava言語による処理が少ないクラスはJSPが向いていると言えます。具体的には、複雑な処理はサーブレットに任せ、出力処理をJSPファイルに任せることができます。

JavaかHTMLのどちらが主体になるかによって、サーブレットとJSPを使い分けるのが一般的です。

2. フォワード

以後の節では、サーブレットやJSPファイルから、他のサーブレットやJSPファイルに、画面遷移を行う方法を説明します。ここでいう画面遷移とは、サーブレットのAPIを使ってWebページを切り替えることを指します。画面遷移の方法としては、「フォワード」「インクルード」「リダイレクト」があります。

2.1. フォワードとは

「フォワード」とは、あるサーブレットやJSPから、他のサーブレットやJSPに処理を移行する機能です。

よく利用されているのは、サーブレットからJSPへのフォワードです。
サーブレットからJSPファイルにフォワードすることで、出力処理をするJSPファイル任せることができるのです。

2.2. フォワードのメソッド

フォワードを行うには、2つの操作が必要です。
まず1つ目は、jakarta.servlet.http.HttpServletRequestインターフェースのgetRequestDispatcher()メソッドで、フォワード先を指定します。

メソッド 説明
RequestDispatcher getRequestDispatcher(String path) 引数で指定したパスへ遷移するRequestDispatcherインスタンスを取得します

フォワード先の指定方法は、以下の通りです。

  • サーブレットクラスの場合:サーブレットのURLパターン
  • JSPファイルの場合: Webappディレクトリからのパス

2つ目は、jakarta.servlet.RequestDispatcherインターフェースのforward()メソッドを利用します。

メソッド 説明
void forward(ServletRequest request, ServletResponse response) フォワードを実行する

フォワードのコード例は、以下の通りです。

//フォワード先を指定し、RequestDispatcherインスタンスを取得する
RequestDispatcher dispatcher = request.getRequestDispatcher("example.jsp"); 
//フォワードを実行する
dispatcher.forward(request, response);

上の2つの文を1つにまとめると、以下の通りです。

request.getRequestDispatcher("example.jsp").forward(request, response);

2.3. フォワードの注意点

フォワード先は、サーブレットクラスとJSPファイルどちらも指定することができますが、同じWebアプリケーション内に限られます。

また、転送後のアドレスバーに表示されるURLは、リクエスト時のままになります。
そのため、フォワードを使うとURLと画面の表示内容にずれが生じる場合があります。このようなズレは、不具合の原因となる場合もあるため、避ける必要があります。

また、フォワードでは、同じリクエスト/レスポンスの往復内で処理が完結する。そのため、リクエストスコープという、リクエストを受け取ってからレスポンスを返すまでの間だけデータを保持できる仕組みも利用できます。

3. リダイレクト

3.1. リダイレクトとは

リダイレクトは、サーブレットやJSPがレスポンスを出力する代わりに、指定したWebページをブラウザに開かせる仕組みです。
ユーザーから見ると、サーブレット/JSPのURLを開いたにもかかわらず、別のURLを開いたように見えます。

リダイレクトは、Webサーバやアプリケーションサーバがブラウザに特別なステータスコードを返すことによって実現します。
HTTPには、リダイレクトを表すステータスコードがいくつか用意されています。
リダイレクトで使用される主なステータスコードは302(Found)です。場合に応じて、303(See Other)や307(Temporary Redirect)が利用されることもあります。

リダイレクト機能を使用すると、 ブラウザにリダイレクトを表すステータスコード(302)とリダイレクト先のURLが返されます。
ステータスコードを受け取ったブラウザは、リダイレクト先として指定されたURLを開きます。

具体的な手順は、以下の通りです。
1、ブラウザが リクエストを送信すると、リダイレクト元のサーブレット/JSPが実行されます
2、リダイレクトを行うと、リダイレクト先のURLがブラウザに送信されます
3、ブラウザはリダイレクト先にリクエストを送信します
4、リダイレクト先はブラウザにレスポンスを返します

フォワードはリクエスト/レスポンスが1往復なのに対し、リダイレクトは2往復していることがわかります。

3.2. リダイレクトのメソッド

リダイレクトを行うには、jakarta.servlet.http.HttpServletResponseインターフェースのsendRedirect()メソッドを利用します。

メソッド 説明
void sendRedirect(String location) 引数で指定されたURLにリダイレクトします

リダイレクト先の指定は、同じアプリケーション内の場合は以下を記入します。

  • サーブレットクラスの場合:サーブレットのURLパターン
  • JSPファイルの場合: Webappディレクトリからのパス

リダイレクトは、アプリケーション外の別のアプリや別のサイトなどのURLを指定することも可能です。

リダイレクトのコード例は、以下の通りです。

response.sendRedirect("http://localhost:8000/example/ExampleServlet"); 

3.3. リダイレクトの注意点

フォワード先は同じWebアプリケーション内に限られましたが、リダイレクトは別のアプリケーションや別のページのURLも指定することができます。
そのため、外部のアプリケーションや外部ページに遷移したい場合は、リダイレクトを用います。

フォワードは、フォワード後もリクエスト元のURLが表示されていました。しかし、リダイレクトではリダイレクト先のURLに変わっているため、URLと画面のずれが起こることはありません。
フォワードを使うと、URLと画面がずれてしまうような状況では、リダイレクトを使用すると良いでしょう。

また、リダイレクトでは、リダイレクト時にリクエストが新しくなってしまうため、リクエストスコープは利用できません。セッションスコープやアプリケーションスコープは利用可能です。

4. インクルード

4.1. インクルードとは

インクルードは、フォワードと同じく、サーブレット/JSPから他のサーブレット/JSPを呼び出す機能です。

フォワードとの違いは2点です。
1、呼び出されたサーブレット/JSPの処理が終わると、呼び出し元のサーブレット/JSPに処理が戻る
2、インクルードする側のサーブレット/JSPがレスポンスを出力する

具体的な手順を見ると、以下の通りです。

1、ブラウザがリクエストを送信すると、インクルード元のサーブレット/JSPが実行されます
2、インクルードを実行すると、インクルード先サーブレット/JSPが実行されます
3、インクルード先の処理が終了すると、インクルード元のサーブレット/JSPに処理が戻ります。
4、処理が終わったインクルード元のサーブレットは、ブラウザにレスポンスを返します。

インクルードは、複数のサーブレット/JSPファイルを組み合わせて、レスポンスを出力する場合によく用いられます。インクルード後はインクルード元に処理が戻るので、複数のファイルの出力をどのように組み合わせるかを、インクルード元で制御することができます。
具体的には、ヘッダーやフッターなど複数のページの共通する部分を1つのファイルにまとめて、使い回す場合に利用されます。共通部分を1つのファイルにまとめることによって、変更を容易にし、保守性を高めることができます。

4.2. インクルードのメソッド

インクルード先の指定は、フォワードと同じく、RequestDispatcherインターフェースのgetRequestDispatcher()メソッドを利用します。

インクルードの実行には、RequestDispatcherインターフェースのinclude()メソッドを利用します。

メソッド 説明
void include(ServletRequest request, ServletResponse response) インクルードを実行する

インクルードのコード例は、以下の通りです。

//インクルード先を指定し、RequestDispatcherインスタンスを取得する
RequestDispatcher dispatcher = request.getRequestDispatcher("header.jsp"); 
//インクルードを実行する
dispatcher.include(request, response);

上の2つの文を1つにまとめると、以下の通りです。

request.getRequestDispatcher("header.jsp").include(request, response);

4.3. インクルードの注意点

インクルードの注意点は、フォワードと同様です。

インクルード先は、サーブレットクラスもJSPファイルもどちらも指定することができますが、同じWebアプリケーション内に限られます。

また、転送後のアドレスバーに表示されるURLは、リクエスト時のままです。

同じリクエスト/レスポンスの往復内で処理が完結するため、リクエストスコープも利用できます。

まとめ

  • Servlet/JSP は、Java言語で動的なWebページを生成するための技術であり、Webサーバと連携するWebコンテナ上で動作します。JSPは最終的にサーブレットに変換・実行されます

  • フォワードは、アプリケーションサーバ内部で処理を他のサーブレット/JSPに移行させる機能です。リクエストスコープの情報を引き継げますが、ブラウザのURLは変わりません

  • リダイレクトは、ブラウザに新しいURLへの再リクエストを促す仕組みです。URLが変更されるため、画面とのズレは起こりませんが、リクエストスコープの情報は失われます

  • インクルードは、他のサーブレット/JSPの処理を呼び出し、処理終了後に呼び出し元に戻る機能です。主に複数のファイルの情報を統合するのに利用され、リクエストスコープの情報は引き継がれます


記事は以上です。
最後までお読みいただき、ありがとうございました。

参考情報一覧

この記事は以下の情報を参考にして執筆しました。

  • [スッキリわかるサーブレット&JSP入門 第4版]
  • [基礎からのサーブレット/JSP 第5版]
  • JSP & Servlet 入門 (最終更新 2018-01-09) (参照 2025-10-8)
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?