ナビゲーション規則に基づく Web ページ間のナビゲート

Web サイト上のナビゲーションを JSF ハンドラーによって制御することで、あるページから別のページにユーザーを転送したり、ページ間でデータの受け渡しを行ったりすることができます。 このようなページ・ナビゲーション制御を行うために、EGL は JavaServer Faces (JSF) のナビゲーション機能と緊密な連携を行います。

EGL は、別のページにナビゲートするために、「URL に転送 (forward to URL)」と、デフォルトの「ラベルに転送 (forward to label)」の 2 つの方法を備えています。 「URL に転送 (forward to URL)」を使用するときには、ターゲット・ページを示す絶対 URL または相対 URL を指定します。 「ラベルに転送 (forward to label)」を使用するときには、 結果としてターゲット・ページを指すナビゲーション規則を指定します。 EGL アプリケーションのページ間でナビゲートするときには、「ラベルに転送 (forward to label)」を使用し、別のアプリケーションの Web ページにナビゲートするときには、「URL に転送 (forward to URL)」を使用します。

JSF サーブレットは、forward ステートメント または redirect ステートメントのいずれかを実行することで、forward ステートメントに応答します。JSF リダイレクトは、ユーザーの Web ブラウザーに対して、別のターゲット・ページをロードするようにプロンプトを出します。これは、ユーザーが新しい URL をブラウザーのアドレス・バーに入力した場合と同じ結果となりますが、最初のページに渡された何らかの要求情報の欠落も含まれることになります。 JSF 転送 (EGL forward ステートメントと混同しないでください) は、新規ページをブラウザーにロードしますが、ロケーションが変更されたことはブラウザーに示しません。 JSF 転送の場合、ブラウザーは元のページ・ロケーションにいると考えていますが、ブラウザーは 新規のターゲット・ページを表示しています。 この場合、要求情報は、新規ターゲット・ページで使用できます。 ただし、ブラウザーおよびサーブレットは同期していません。これは、ブラウザーが、サーブレットから要求したものとは同じページを表示していないためです。 この不一致により問題が発生する可能性があります。例えば、画像やスタイルシートなどのファイルへの相対リンクは、転送先のターゲット・ページではなく、元のページに対して相対的でなければなりません。これは、ブラウザーが、そのリンクを元のページに対して相対的と解釈するからです。

JSF ハンドラーの onConstructionFunction プロパティー、onPreRenderFunction プロパティー、または onPostRenderFunction プロパティーで定義された関数では、 forward to URL を使用することはできますが、forward to label は使用できません。

ラベルへ転送

EGL アプリケーション内でページからページへ ナビゲートするときは、「ラベルへ転送 (forward to label)」を使用します。 あるページから別のページへユーザーを転送するには、ターゲット・ページを 指す JSF ナビゲーション規則の名前を認識しておく必要があります。デフォルトでは、ページを指すナビゲーション規則の名前は、そのページを管理する JSF ハンドラーの名前と同じになります。

例えば、myPage.jsp という名前を持つページであれば、myPage.egl という名前のファイルに myPage という名前の JSF ハンドラーを持っています。 デフォルトでは、このページのナビゲーション規則は myPage になります。 ターゲット・ページのナビゲーション規則を知っていれば、EGL の forward ステートメントを使用して、ユーザーの Web ブラウザーをターゲット・ページに送ることができます。 このケースでは、myPage.jsp ページへの転送を行うために、次のコードを使用します。
forward to label "myPage";
ページを指すナビゲーション規則を探すには、faces-config.xml ファイル内を検索します。 このファイルは、EGL Web プロジェクトの WebContent/WEB-INF フォルダーにあります。 各規則と、その規則から導かれるページが、このファイルにリストされています。 前述のサンプルでは、次のようなナビゲーション規則を使用しました。
<navigation-case>
    <from-outcome>myPage</from-outcome>
    <to-view-id>/myPage.jsp</to-view-id>
</navigation-case>
ナビゲーション規則には、ルールのラベルと、ターゲット・ページへの相対リンクの 2 つのストリングがあります。 このケースでは、ラベルは myPage で、リンクは、ナビゲーション規則を使用したページと同じディレクトリーにある、名前が myPage.jsp のページを参照します。 最初にスラッシュがあり、その後にページのファイル名が続くことに注意してください。これは、ナビゲーション規則の要件です。 このナビゲーション規則は、前述のとおり JSF 転送となります。
別の EGL Web プロジェクトのページにナビゲートするには、相対 URL 参照を使用します。 例えば 、ページ myProject01/myPage01.jsp から、 名前が myProject02 のプロジェクトの myPage02.jsp というファイルにリンクするには、以下のナビゲーション規則を使用します。
<navigation-case>
    <from-outcome>myPage02</from-outcome>
    <to-view-id>/../myProject02/myPage02.jsp</to-view-id>
    <redirect/>
</navigation-case>
<redirect/> タグは、別のプロジェクトのターゲット・ページを指すナビゲーション規則で必要になります。 あるプロジェクトのページから別のプロジェクトのページにナビゲートするときに、JSF は、転送ではなくリダイレクトを使用します。

URL へ転送

別の Web ページにユーザーを送るには、forward を使用する方法もあります。この場合は、ページの完全な URL を指定します。
forward to URL "http://www.ibm.com";
次のように、相対 URL を指定することもできます。
forward to URL "../myPage02.jsp";
最終的に、コンテキスト・ルートか、サーバー上の全プロジェクトを含むディレクトリーのいずれかに相対する URL を指定することができます。
forward to URL "/myProject02/myPage02.jsp";

EGL JSF ハンドラーで制御されるページへの転送を行う際には、必ず正しい拡張子 (.faces または .jsp のいずれか) を使用してください。これらの拡張子の説明は、サーバーでの Web ページの実行にあります。


フィードバック