ナビゲーション・ルールの各ナビゲーション・ケースでは、次のいずれかを使用できます。
"redirect"要素は、指定した"to-view-id"へのナビゲーションは、通常のViewHandlerメカニズムではなく、HTTPリダイレクトを実行して行う必要があることを示します。
同じページに対して複数のナビゲーション・ルールを定義できるため(多くの場合、個別のJSF構成ファイルで定義)、グローバルとデフォルトのナビゲーション・ルールを定義できます。このため、次の各項で説明するように、ルール間でナビゲーション・ケースの重複と競合が発生する場合があります。
ユーザーがアプリケーション・ページ上のボタンをクリックすると、ナビゲーション・ハンドラでは、次に表示するJSFページを選択します。
単純な形式のページ・ナビゲーションでは、静的ナビゲーション・ケースが使用されます。静的ナビゲーションを使用した場合は、ユーザーがボタンまたはリンクをクリックすると、定義済の固定されたJSFページが常に表示されます。静的ナビゲーションを定義するには、ナビゲーション・ケースをアクション・メソッドではなく結果の値として使用します。ボタンまたはリンク自体によってアクション属性が使用され、文字列の結果が指定されます。
たとえば、ページ上の単純なボタンは次のように定義できます。
<h:commandButton label="Login" action="login"/>
ナビゲーション・ルール内の対応するナビゲーション・ケースは、次のような形式で定義できます。
<navigation-rule>
<from-view-id>...</from-view-id>
<navigation-case>
<from-outcome>login</from-outcome>
<to-view-id>/welcome.jsp</to-view-id>
</navigation-case>
</navigation-rule>
このナビゲーション・ケースでは、ボタンまたはリンクの結果が結果login
である場合、常にページ/welcome.jsp
が表示されるように指定します。
静的ナビゲーション・ケースは、アプリケーション全体またはアプリケーションの一部で発生するナビゲーション・ケースを定義する場合に便利です。たとえば、ホーム・ページに戻るリンク、背景やヘルプ情報を表示する標準的なリンクなどがあります。
次に、アプリケーション内のいずれかのページで「Logout」リンクがクリックされたときに、常にログアウト・ページ/logout.jsp
を表示するナビゲーション・ルールの例を示します。
<navigation-rule>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/logout.jsp</to-view-id>
</navigation-case>
</navigation-rule>
静的ナビゲーション・ケースは、ナビゲーション・ボタンまたはリンクがいつクリックされても常に同じページを表示する場合に適用されます。これに対して、ユーザーが入力した内容に応じて次に表示するページを決定する場合は、動的ナビゲーション・ケースが必要です。
動的ナビゲーション・ケースではアクション・メソッドが使用されます。アクション・メソッドは、ナビゲーション処理を実行するバッキングBeanのメソッドです。アクション・メソッドは、そのメソッドの処理によって決まる文字列値を戻します。
この場合、リンクのナビゲーション・ケースでは、メソッドから戻される可能性があるすべての結果を処理する必要があります。たとえば、「発行」ボタンをクリックした結果は、成功か失敗のいずれかになるのが一般的です。
ページ上のボタン自体は次の形式で定義できます。
<h:commandButton action="#{someBean.someActionmethod}"/>
このメソッドから戻される可能性がある結果のナビゲーション・ケースは、次のように定義できます。
<navigation-rule>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/success.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>fail</from-outcome>
<to-view-id>/again.jsp</to-view-id>
</navigation-case>
...
</navigation-rule>
アクション・メソッドの使用方法については、「ナビゲーションに影響を与えるアクション・メソッドおよび結果について」を参照してください。
特定の1ページまたは特定の複数ページからのリンクに対してナビゲーション・ルールを使用する場合は、デフォルト・ナビゲーション・ルールを使用して、独自のナビゲーション・ケースでは特に記述していないすべての結果を捕捉できます。
たとえば、特定の「発行」コマンド・ボタンを処理するアクション・メソッドを使用しているとします。success
ケースは特定のページを表示して処理し、その他すべての結果については、ユーザーが操作を続行できないことを説明するページを表示します。この場合は、1つのナビゲーション・ケースを使用してsuccess
を処理し、もう1つのナビゲーション・ケースでその他すべての結果を処理します。次のようなナビゲーション・ルールを使用できます。
<navigation-rule>
<from-view-id>/order.jsp</from-view-id>
<navigation-case>
<from-action>#{backing_home.submit}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/summary.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{backing_home.submit}</from-action>
<to-view-id>/again.jsp</to-view-id>
</navigation-case>
</navigation-rule>
このナビゲーション・ルールでは、最初のナビゲーション・ケースが動的ナビゲーション・ケースで、アクション・メソッドによって結果が判断されます。結果がsuccess
の場合、ユーザーはページ/summary.jsp
に移動します。
2番目のナビゲーション・ケースはデフォルト・ナビゲーション・ケースで、アクション・メソッドによって戻される他のすべての結果を補足し、それらの結果に対してページ/action.jsp
を表示します。
各ナビゲーション・ケースはリダイレクトとして定義できます。リダイレクトとして定義しない場合は、直接レンダリングが使用されます。
ナビゲーション・ケースをリダイレクトとして定義すると、JSFでは、ブラウザに対して必要な新規ビューをリクエストするように要求するリダイレクト・レスポンスを送信します。ナビゲーション・ケースをリダイレクトとして定義しない場合、必要なビューは単に現在のリクエストに対するレスポンスとしてレンダリングされます。
ナビゲーション・ケースをリダイレクトとして定義すると、ユーザーに対して表示されるブラウザのアドレス・フィールドのURLは、新規ビューのURLを表示するように調整されます。直接レンダリングを使用すると、ユーザーに表示されるアドレス・フィールドは更新されません。直接レンダリングは、リダイレクトよりも処理が速くなります。
ナビゲーション・ケースをリダイレクトとして定義するかどうかを決定する際は、次の事項を考慮してください。
同じページに戻るようにユーザーがページにブックマークを設定した場合に、URLが新規ビューに調整されていないと、そのブックマークによって前のビューへの参照が継続します。これを回避するには、ナビゲーション・ケースをリダイレクトとして定義します。
ユーザーによるページの再ロードが原因で、URLが新規ビューにリフレッシュされない場合は、注文を重複して発行するなどの問題が発生する可能性があります。不適切な結果が発生する可能性がある場合は、ナビゲーション・ケースをリダイレクトとして定義します。
ナビゲーション・ケースをリダイレクトとして定義するには、次のように、ナビゲーション・ケースの定義に<redirect/>
要素を挿入します。
<navigation-rule>
<navigation-case>
<from-outcome>employees</from-outcome>
<to-view-id>/emps.jsp</to-view-id>
<redirect/>
</navigation-case>
<navigation-case>
<from-outcome>departments</from-outcome>
<to-view-id>/depts.jsp</to-view-id>
<redirect/>
</navigation-case>
...
</navigation-rule>
ナビゲーション・ルールは、1つのページ、複数のページまたはアプリケーション内の全ページに適用でき、各ルールには独自のナビゲーション・ケースがリストされます。その結果、1つのページ上のリンクに対するナビゲーション・ケースが複数のナビゲーション・ルールにまたがる場合があります。これは、アプリケーションの特定の場所に移動するための共通コントロールをユーザーに提供する場合に発生します。この場合は、1つのルールですべての共通コントロールに対するナビゲーション・ケースを定義し、他のナビゲーション・ルールではそれ以外のコントロールからのナビゲーションを定義できます。
別の例では、ページ上の複数のナビゲーション・リンクに対してナビゲーション・ルールを定義し、ナビゲーションが連続する通常のケースを処理します。もう1つのルールでは、連続しない場合のナビゲーションを定義します。
このようなナビゲーションを定義するには、複数のナビゲーション・ルールを個別に使用しますが、すべてのナビゲーション・ケースはまとめて定義します。次のような一連のルールを使用できます。
<navigation-rule>
<from-view-id>/order.jsp</from-view-id>
<navigation-case>
<from-action>#{backing_home.submit}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/summary.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{backing_home.check}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/check.jsp</to-view-id>
</navigation-case></navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/order.jsp</from-view-id>
<to-view-id>/again.jsp</to-view-id>
</navigation-case>
</navigation-rule>
これらのルールが評価されると、ページ上でイベントが発生します。その場合、特殊なナビゲーション・ケースが最初に使用され、一般的なケースは後に使用されます。「JSFナビゲーション・ルールの評価について」を参照してください。
ナビゲーション・ケースが複数のルールにまたがる場合と同様に、ナビゲーション・ケースは、同じナビゲーション・ルールまたは異なるナビゲーション・ルールに重複して定義できます。
「複数のルールにまたがるナビゲーション・ケース」の項で説明した例は、ナビゲーション・ケースの重複の1例です。つまり、あるルール内の1つのナビゲーション・ケースが特定の1つの結果を処理し、別のルール内のナビゲーション・ケースがそれ以外のすべての結果を処理します。ルールの重複は1つのルール内でも発生する場合があります。ユーザーがリンクの1つをクリックした場合のルールの評価は、ナビゲーション・ケースの定義に従って正確に行われます。つまり、特殊なナビゲーション・ケースが最初に考慮され、一般的なケースは後で考慮されます。「JSFナビゲーション・ルールの評価について」を参照してください。
同じページに適用するナビゲーション・ルールは複数定義できるため、ルール間で競合が発生する可能性があります。また、ナビゲーション・ルールは複数のJSF構成ファイルに定義できるため、同じルールが異なる複数のファイルに定義されている可能性があります。
次のルールは、異なるJSF構成ファイルに定義されているとします。
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>globalhelp</from-outcome>
<to-view-id>/menu/generalHelp.html</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>globalhelp</from-outcome>
<to-view-id>/menu/help.html</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
このような場合は、常に最後のルールが使用されます。異なるJSF構成ファイル間でルールの競合がある場合は、web.xml
ファイルのリストに従って、最後にロードされた構成ファイルのルールが優先して使用されます。
JSFアプリケーションでのナビゲーションについて
JSFナビゲーション・ルールについて
JSFナビゲーション・ルールおよびADF Facesのダイアログについて
JSFナビゲーション・ルールの評価について
ナビゲーションに影響を与えるアクション・メソッドおよび結果について
JSF編集ツールについて
Copyright © 1997, 2006, Oracle. All rights reserved.