JavaのRequestDispatcherの使い方
RequestDispatcherは、JavaのサーブレットAPIに含まれているインターフェースで、サーブレットから別のサーブレットやJSPにリクエストを転送したり、インクルードしたりするために使用されます。
以下に、RequestDispatcherの主な使い方を説明します。
1. リクエストの転送 (forward)
forwardメソッドを使うと、リクエストを他のリソース(サーブレット、JSPなど)に転送します。
転送先のリソースがレスポンスを生成します。
例
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.RequestDispatcher; public class ForwardExampleServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 転送先のjsp String nextJSP = "/nextPage.jsp"; RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(nextJSP); dispatcher.forward(request, response); } }
2. リクエストのインクルード (include)
includeメソッドを使うと、現在のリクエストに対して他のリソースをインクルード(埋め込み)します。
インクルードされたリソースは、部分的なレスポンスを生成し、元のレスポンスに追加されます。
ほぼほぼ使われない処理だとは思います。
例
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.RequestDispatcher; public class IncludeExampleServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String headerJSP = "/header.jsp"; RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(headerJSP); dispatcher.include(request, response); // 自身のレスポンスを生成 response.getWriter().println("This is the main content."); String footerJSP = "/footer.jsp"; dispatcher = getServletContext().getRequestDispatcher(footerJSP); dispatcher.include(request, response); } }
リクエストディスパッチャーの取得方法
RequestDispatcherのインスタンスを取得するには、以下のいずれかの方法を使用します。
1. サーブレットコンテキストから取得する:
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/path/to/resource");
2. HTTPサーブレットリクエストから取得する:
RequestDispatcher dispatcher = request.getRequestDispatcher("/path/to/resource");
注意点
- forwardメソッドを呼び出す前に、レスポンスをクライアントに送信してしまうと、IllegalStateExceptionがスローされます。
- includeメソッドを使う場合、インクルードされたリソースが独自にレスポンスヘッダを設定することは避けてください。
インクルードされたコンテンツは、元のレスポンスの一部として扱われます。
これらの方法を使うことで、サーブレット間でリクエストやレスポンスを効果的に共有し、アプリケーションの構成を柔軟にすることができます。