Servlet/JSPの画面遷移[Java]
はじめに
こんにちは。
プログラミング初心者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)
Discussion