制御の受け渡し

RequestDispatcher オブジェクトの forward メソッドを使用して、ほかのサーブレットまたは JSP に制御を渡すことができます。forward メソッドを使用する場合、呼び出し側のサーブレットから出力ストリームに書き込むことはできません。必要であれば、呼び出し側のサーブレットは、ServletRequest オブジェクトの setAttribute メソッド (JSP の request オブジェクト) を使用して属性を設定することにより、目的のサーブレットに情報を渡します。その場合、ターゲット プログラムは次の方法で属性にアクセスします。

RequestDispatcher オブジェクトの参照は、getRequestDispatcher メソッドによって取得します。このメソッドは ServletContext オブジェクトと ServletRequest オブジェクトの両方に含まれています。唯一の違いは、
ServletRequest.getRequestDispatcher で指定するパス名には先頭のスラッシュが不要なことです。したがって、相対 URL を使用することができます。
ServletContext.getRequestDispatcher の場合は、先頭のスラッシュが必要です。次に、ServletContext.getRequestDispatcher を使用した例を示します。

ほかのサーブレットに制御を渡す方法

次の例では、ほかのサーブレットに制御を渡します。

import java.io.*; 
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TestCaller extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws IOException, ServletException { 
  // ServletContext を取得します。
  ServletContext sc = this.getServletContext();
  // RequestDispatcher で目的のサーブレットをラップします。
  RequestDispatcher rd = sc.getRequestDispatcher("/servlet/callMe");
  if (rd !=null) {
    // 制御をサーブレットに渡します。
    try {
      rd.forward(req, resp);
    }
    catch (Exception e) {
      sc.log("Problem invoking servlet.", e);
    }
  }
}
}

JSP に制御を渡す方法

RequestDispatcher オブジェクトを使用して、JSP に制御を渡すことができます。


メモ

この方法を使用すると、 HTML ページに制御を渡すこともできます。


次の例では、JSP に制御を渡します。

import java.io.*; 
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TestCaller extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws IOException, ServletException { 
  // ServletContext を取得します。
  ServletContext sc = this.getServletContext();
  // RequestDispatcher で JSP をラップします。
  RequestDispatcher rd = sc.getRequestDispatcher("/test.jsp");
  if (rd !=null) {
    // JSP に制御を渡します。
    try {
      rd.forward(req, resp);
    }
    catch (Exception e) {
      sc.log("Problem invoking JSP.", e);
    }
  }
}
}