web-dev-qa-db-ja.com

リクエストディスパッチコンセプトのインクルードメカニズムとフォワードメカニズムの違いは?

Forward():これは、Request&ServeletContextによって2つの方法で実行できます。サーブレットからサーバー上の別のリソース(サーブレット、JSPファイル、またはHTMLファイル)へのリクエストの転送。転送は、クライアントの知らないうちにサーバー側で行われます。

転送要求を呼び出すと、別のリソースが要求を処理することをクライアントに通知せずに、サーバー上の別のリソースに要求が送信されます。このプロセスは、Webコンテナ内で完全に発生します。

単に

include:現在のファイルに別のファイルを含めます

forward:現在のリクエストを転送ページに転送します

40
Ajay Takur

主な違いは、forwardを使用すると、コントロールは呼び出している次のサーブレット/ jspに転送されますが、includeは現在のサーブレットでコントロールを保持し、インクルードするだけです。呼び出し元のservlet/jspによって実行される処理(out.printlnまたは他の処理を実行するような)。

32
mtk

2つのタグの違いは、動作方法です。あなたがそれをよりよく想像できるように、私は例を挙げます。

2つのページ、pageAとpageBがあるとします。 pageAにincludeタグを記述しました。この場合、コントロールはincludeタグを呼び出すまでpageAにありました。この時点で、フルコントロールはpageBに移動します。完了すると、includeタグの後のコーディングの次のポイントから始まり、pageAの残りの部分に続く制御がpageAに返されます。

わかりやすくするために、同じページpageAとpageBがあるとしますが、今回はincludeタグではなく、pageAでforwardタグを使用します。繰り返しますが、コントロールはpageAでforwardタグを呼び出すまでpageAで始まります。この時点で、includeタグと同様にコントロールがpageBに転送されます。しかし、違いはpageBが完了するとどうなるかです。 forwardタグの場合、制御は再びpageAに戻りません。

63
AmrAngry

include(request、response);

リソースが静的な場合、includeメソッドはプログラムによるサーバー側インクルードを有効にします。リソースがWebコンポーネントの場合、メソッドの効果は、含まれているWebコンポーネントにリクエストを送信し、Webコンポーネントを実行し、実行の結果を含むサーブレットからの応答に含めることです。

含まれるWebコンポーネントは、リクエストオブジェクトにアクセスできますが、レスポンスオブジェクトでできることは制限されています。

  • 応答の本文に書き込み、応答をコミットできます。
  • ヘッダーを設定したり、応答のヘッダーに影響するsetCookieなどのメソッドを呼び出したりすることはできません。

Webコンポーネントから返される応答に、バナーコンテンツや著作権情報などの別のWebリソースを含めると便利なことがよくあります。

forward(request、response);

一部のアプリケーションでは、1つのWebコンポーネントにリクエストの予備処理を行わせ、別のコンポーネントにレスポンスを生成させることができます。たとえば、リクエストの性質に応じて、リクエストを部分的に処理してから別のコンポーネントに転送する場合があります。

制御を別のWebコンポーネントに転送するには、RequestDispatcherのforwardメソッドを呼び出します。リクエストが転送されると、リクエストURLは転送されたページのパスに設定されます。元のURIとその構成部分は、リクエスト属性として保存されます。

javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string]  

Forwardメソッドは、ユーザーに返信するための別のリソース責任を与えるために使用する必要があります。サーブレット内の ServletOutputStream または PrintWriter オブジェクトに既にアクセスしている場合、このメソッドは使用できません。そうすると IllegalStateException がスローされます。

関連リンク

26
Aniket Kulkarni

2つの主な違いは、forward()メソッドが呼び出された後に出力ストリームを閉じるのに対して、includeメソッドは出力ストリームをOPENのままにすることです。

例で答える:xxx.Javaという名前のサーブレットページとyy.jspという名前のjspページを用意します。

yy.jsp内

_WELCOME to yy.jsp
_

xxx.Javaで // using forward()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.forward(request,response); out.println("back to servlet"); //this wont b displayed

出力

_WELCOME to yy.jsp 
_

xxx.Javaで // include()を使用

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.include(request,response); out.println("back to servlet");

出力

_WELCOME to yy.jsp back to servlet
_

ただし、WE PUT a

System.out.println("console output");

.forward()または.include()呼び出しのいずれかの後、各ケースでコンソール出力が生成されます。クライアントへの応答について

したがって、基本的な部分は、サーバー側のコンポーネントで処理し、クライアントのマークアップを生成するためにJSPまたはサーブレットに転送する場合です。JSPまたはサーブレットの処理が終了すると、他のコンポーネントを呼び出すことはできなくなりますクライアントに送信されます。転送を実行すると、現在の要求と応答サイクルのマークアップ生成が終了します。

あるいは、インクルードを使用すると、出力ストリームが開いたままになるため、必要なクライアント側マークアップを生成するために、さまざまなファイルを呼び出すことができます。したがって、クライアントベースのマークアップを生成するコンポーネントのチェーンに、2つまたは3つのJSPファイルとサーブレットを含めることができます。インクルードを使用する場合、出力ストリームは呼び出し後に閉じられません。

8
uttsav