Revised: 2nd/July/2002
Web アプリケーションは一連のコンポーネントで成り立っています。これらの間でリソースを共有し、制御を受け渡すための仕組みが用意されています。
RequestDispatcher
インタフェースを使うと、クライアント要求をリソースへディスパッチ(割り当て)することができます。
このインタフェースの実装は ServletContext
型の暗黙オブジェクト context
から取得できます。
getRequestDispatcher()
/
" で始めて、コンテキスト・ルート(ドキュメント・ルートにマップされる名前)からの相対パスを表現します。String path = “/raisons.jsp”; RequestDispatcher rd = context.getRequestDispatcher(path);
getNamedDispatcher()
String name = "myServlet"; RequestDispatcher rd = context.getRequestDispatcher(name);
こうして取得した Web リソースのディスパッチャを使って、クライアント要求/応答を、そのリソースにディスパッチできます。
当該リソースでの制御内に JSP や bean による処理を挿入することが出来ます。そのためには、現在処理中の要求/応答を、挿入したいリソースをラップしているディスパッチャに渡します。
次の例は、コンテキスト・ルート dispatcher
の WEB-INF
内にあるサーブレットに、/dispacher/jsp/included.jsp
の制御を挿入する場合です。
String path = “/jsp/included.jsp”; RequestDispatcher rd = context.getRequestDispatcher(path); rd.include(request, response);
コンテキスト・ルートの情報が完全に欠落していますが、特に指定しない限り、自分が所属しているコンテキスト・ルートからの相対パスとして解釈されるので、パスの解決に問題は生じません。
include
では、要求/応答を既存の制御から他のリソースに放り投げ、投げた先のリソースの制御が終了すれば、呼び出したリソースに制御が戻ります。forward
では、要求/応答を投げたら、元のリソースのスレッドは終了します。以降は投げつけられたリソースが、要求/応答の責任を持ちます。
次の例は、コンテキスト・ルート dispatcher
の WEB-INF
内にあるサーブレットから、/dispacher/jsp/forwarded.jsp
へ要求/応答を放り投げて、自信のスレッドは終了して責任を放棄します。これ以降、クライアントへ応答を返す責任は forwarded.jsp
が持ちます。
String path = “/jsp/forwarded.jsp”; RequestDispatcher rd = context.getRequestDispatcher(path); rd.forward(request, response);
これもまた、コンテキスト・ルートの情報が完全に欠落していますが、特に指定しない限り、自分が所属しているコンテキスト・ルートからの相対パスとして解釈されるので、パスの解決に問題は生じません。
JSP に、他のリソースの制御を挿入したり、他のリソースへ制御を受け渡したりする場合は、アクションタグと、ディレクティブの二つの方法が提供されています。
JSP ページに他の Web リソースを組み込むためには、 include
ディレクティブと jsp:include
要素の二つの方法が提供されています。
include
ディレクティブディレクティブは、その JSP が最初に要求を受け取って、サーブレットに変換されるときに処理されます。サーバが稼動している限り静的なコンテンツを挿入する場合に有効です。
例えば、コピーライトを生成する JSP が copyright.jsp
に記述されている場合、これを挿入するには、挿入したい場所に次のように記述します。
<%@ include file="copyright.jsp" %>
ページのヘッダ、フッタ、コピーライトなど、動的な変化が必要ない場合は有効です。
jsp:include
要素アクションタグは、当該 JSP が要求されるたびに処理されます。JSP は最初に要求されてサーブレットに変換されたものが、二回目以降に要求を受けるとスレッドを発生させて処理します。つまり、アクションタグは要求されてスレッドを発生させるたびに実行されます。
動的なリソースの場合、要求が組み込まれたリソースに送信され、組み込まれたページが実行されます。その後、呼び出した JSP ページの応答にその結果が組み込まれます。
<jsp:include page="myFavoritPersons.jsp" />
サーブレットにおける要求の転送と同じように、 JSP でも要求を転送して処理の責任を委譲することが出来ます。組み込み (include) とは異なり、転送の場合はアクションタグでしかサポートされていません。制御の責任を負うということは専用のスレッドを発生させることになるので、起動時にしか処理されないディレクティブは意味が無いと言うことです。内部的には、サーブレットに変換後、RequestDispatcher
型オブジェクトの forward(request, response)
が呼ばれています。
<jsp:forward page="/response.jsp" />
include であれ、forward であれ、制御 を投げる JSP は、投げ渡す対象のリソースにパラメタを同時に与えることが出来ます。そのためには、アクションタグの子要素で param
要素を指定します。
<jsp:include page="..." > <jsp:param name="param1" value="value1"/> </jsp:include>