22

RequestDispatcher'sforward()HttpServletResponse'sのsendRedirect()方法の違いは何ですか?
誰かが例で説明し、リアルタイムの例でこれらのメソッドの最良の使用法を説明できますか?

4

4 に答える 4

21

リダイレクトは、クライアントに返送される応答の一種ですが、転送委任は完全にサーバー側で行われ、転送アクションの結果は元の URL からのみ送信されたかのようにクライアントに返されます。

もう 1 つの違いは、転送委任はアプリケーション内のリソースにのみ使用できるのに対し、リダイレクト コマンドはクライアント ブラウザーを現在のドメインの外部にリダイレクトできることです。

例:

// Sends a temporary redirect to the HTTP client. Only absolute URLs are allowed.
ServletResponse.sendRedirect(String location);


// Delegates one HttpRequest to another dynamic or static resource
HttpRequest.getRequestDispatcher("example.jsp").forward(request, response);


// Includes/enriches current response with another dynamic or static resource
HttpRequest.getRequestDispatcher("example.html").include(request, response);


別の良い説明がここにあります:
sendRedirect() と forward() の違い

于 2011-08-28T10:38:59.313 に答える
6

SendRedirect ():
このメソッドは HttpServletResponse インターフェイスで宣言されています

シグネチャ: void sendRedirect(String url)

このメソッドは、クライアント要求を別の場所にリダイレクトしてさらに処理するために使用されます。新しい場所は、別のサーバーまたは別のコンテキストで利用できます。Web コンテナーはこれを処理し、ブラウザーを使用して要求を転送し、この要求はブラウザーで新しいものとして表示されます。リクエスト。これは、クライアント側のリダイレクトとも呼ばれます。

Forward (): このメソッドは RequestDispatcher インターフェイスで宣言されています。

署名: forward(ServletRequest リクエスト、ServletResponse レスポンス)

このメソッドは、同じサーバー内でさらに処理するために別のリソースにリクエストを渡すために使用されます。別のリソースは、任意のサーブレット、jsp ページ、任意の種類のファイルである可能性があります。クライアントに通知されていない別のリソース。どのリソースが requestDispatcher オブジェクトで言及されているリクエストを処理します。これは、ServletContext または Request を使用して 2 つの方法で取得できます。これは、サーバー側リダイレクトとも呼ばれます。

RequestDispatcher forward() は、同じリクエストを別のリソースに転送するために使用されますが、ServletResponse sendRedirect() は 2 段階のプロセスです。sendRedirect() では、Web アプリケーションは、リクエストを送信する URL を含むステータス コード 302 (リダイレクト) でクライアントに応答を返します。送信されたリクエストは、まったく新しいリクエストです。

B forward() はコンテナーによって内部的に処理されますが、sednRedirect() はブラウザーによって処理されます。

C追加のネットワーク呼び出しが必要な sendRedirect() メソッドよりも高速であるため、同じアプリケーション内のリソースにアクセスするときは forward() を使用する必要があります。

D forward() ではブラウザは実際の処理リソースを認識せず、アドレス バーの URL は同じままですが、sendRedirect() ではアドレス バーの URL は転送されたリソースに変更されます。

E forward() を使用して別のコンテキストでサーブレットを呼び出すことはできません。この場合にのみ sendRedirect() を使用できます。

詳細説明はこちら

于 2015-02-20T10:49:17.880 に答える