クライアントがリクエストするリソースは、時にはサーバがサービスするリソースでないことがあります。次の例は、クライアントが明示的に送信していないリクエストにサーバが応答するときの例です。
次の方法を使用して、あるサーブレットから別のサーブレットにリクエストを渡します。
response.sendRedirect メソッド
forward メソッドを使用する場合、呼び出し側のサーブレットから出力ストリームに書き込むことはできません。必要な場合は、呼び出し側のサーブレットは、setAttribute メソッド (JSP の request オブジェクト) を使用して属性を設定することで、目的のサーブレットに情報を渡します。この場合、目的のプログラムは次の方法で属性にアクセスできます。
getAttribute メソッドを使用して、これらの属性にアクセスできます。
getAttribute メソッドを使用して、これらの属性にアクセスできます。
RequestDispatcher オブジェクトの forward メソッドを使用して、他のサーブレットや JSP に制御を渡すことができます。このセクションでは、この方法を説明します。
RequestDispatcher オブジェクトへのリファレンスは、getRequestDispatcher メソッドで取得します。このメソッドは ServletContext オブジェクトと ServletRequest オブジェクトの両方にあります。唯一の違いは、ServletRequest.getRequestDispatcher で指定するパス名には先頭のスラッシュが不要なことです。したがって、相対 URL を使用できます。ServletContext.getRequestDispatcher の場合は、先頭のスラッシュが必要です。次の例では、ServletContext.getRequestDispatcher を使用します。
...
ServletContext sc = this.getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/servlet/callMe");
if (rd !=null) {
// 制御をサーブレットに渡します。
try {
rd.forward(req, resp);
} catch (Exception e) {
sc.log("Problem invoking servlet.", e);
}
}
...
サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。
RequestDispatcher オブジェクトを使用して、サーブレットから JSP に制御を渡すことができます。このテクニックを使用すると、HTML ページなどの Web リソースに制御を渡すこともできます。
...
ServletContext sc = this.getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/test.jsp");
if (rd !=null) {
// JSP に制御を渡します。
try {
rd.forward(req, resp);
} catch (Exception e) {
sc.log("Problem invoking JSP.", e);
}
}
...
サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。
response オブジェクトには sendRedirect メソッドがあり、このメソッドでリクエストを新しいターゲットに転送できます。また、sendRedirect メソッドは Location HTTP ヘッダーをレスポンスに追加し、ステータスコードを 302 (Found) に変更します。リクエストが相対 URL や絶対 URL などの場所を参照するように設定できます。相対 URL を指定した場合、JRun はレスポンスを生成する前に現在の URI を使用して、その相対 URL を絶対 URL に変換します。
public void sendRedirect(String URL)
次のサーブレット例では、target_location リクエストパラメータから位置を取得して、そのリクエストをその位置に転送します。
...
String target_location = req.getParameter("target_location");
resp.sendRedirect(target_location);
...
target_location の値は、URL から他のサーブレット名までの String を指定できます。たとえば次のとおりです。
Location ヘッダーを設定します。
sendRedirect メソッドを使用するときは、次の注意事項に配慮してください。
GET リクエストを処理するときは、sendRedirect だけが使用できます。Referer ヘッダーを使用すると、リクエストが転送された後で、そのリクエストの送信元が分かります。sendRedirect メソッドでセッションを使用するときは、メソッドを呼び出す前に必ず URL をエンコードします。TCPMonitor ユーティリティを使用すると、JRun がリクエストメッセージとレスポンスメッセージに設定したヘッダーを表示できます。TCPMonitor の使用方法の詳細については、 「TCPMonitor の使用」 を参照してください。
サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。