2

index.xhtmlJSFフロントページにドロップダウンがあります。関連するコード/コマンドボタンは次のようになります。

    <h:selectOneMenu id="nodes" value="#{MyBacking.chosenNode}">
    <f:selectItems value="#{MyBacking.nodes}" />
</h:selectOneMenu>

<a4j:commandButton value="Retrieve" styleClass="ctrlBtn"
    id="retrieveBtn" style="margin-bottom: 2px;"
    onclick="#{rich:component('nodeLoadWait')}.show()"   # modal
    action="#{MyBacking.redirect}"
    image="/img/btnRetrieve26.png" />

action以前は「こんにちは」に設定されていましたが、私の場合はfaces-context.xml

<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>hello</from-outcome>
        <to-view-id>/nodeMgmt.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

actionが「hello」に設定されている場合、retrieveボタンをクリックすると、その面で正常に機能し、navが処理され、MyBacking.setChosenNodeメソッドによって必要なすべてのデータが割り当てられるため、nodeMgmt.xhtmlのコンテンツが完全に入力されて表示されます。

ただし、ユーザーのクリックによる最初のアクティビティがretrieveタイムアウトした場合、Beanがタイムアウトを検出してもWebページがハングするため、ユーザーを「タイムアウト」ページにリダイレクトしたいと思います。

タイムアウトメッセージ(アプリの「内部」にあるときにエラー検出がすでに存在する)を返すバッキングBeanを処理するために、faces-context.xmlファイルを使用するのではなく、内部で処理することを考えました。

FacesContext.getCurrentInstance()。getExternalContext()。redirectを見つけましたが、JSF1.2javadocにはこれがありません。おそらくそれは特集されていないからですか?それは混乱を招きますがリダイレクトします。この方法に関するドキュメントがないのはなぜですか?

それでも、ページにリダイレクトされますが、最初のリクエスト中にBeanによってインスタンス化されたデータを考慮せずにレンダリングされます。Beanは現在リクエストスコープにあります。Beanの関連コードは次のとおりです。

    try {
        FacesContext.getCurrentInstance().getExternalContext().redirect("nodeMgmt.jsf");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

この種のリダイレクトを行うには、バックエンドJava呼び出しを使用するのが最善の方法ですか?そうでない場合は、使用するのが最善faces-context.xmlですか?もしそうなら、どのように?私たちがここにいる間、誰かが私をFacesContext.getCurrentInstance()。getExternalContext()の使用法の良い読書リソースに導くことができますか?データcosで簡単なナビゲーションを行う方法についてのまともな例があります。

乾杯

4

1 に答える 1

2

FacesContext.getCurrentInstance()。getExternalContext()。redirectを見つけましたが、JSF1.2javadocにはこれがありません。おそらくそれは特集されていないからですか?それは混乱を招きますがリダイレクトします。この方法に関するドキュメントがないのはなぜですか?

確かにあります。

おそらくあなたは間違ったjavadocを読んでいました。FacesContextたぶん1つ?


それでも、ページにリダイレクトされますが、最初のリクエスト中にBeanによってインスタンス化されたデータを考慮せずにレンダリングされます。Beanは現在リクエストスコープにあります。

リダイレクトは、ブラウザに新しいHTTPリクエストを送信するように指示します。そのため、古いリクエストのすべてのリクエストスコープのBeanはガベージされ、新しいリクエストで再初期化されます。リクエストを保持したい場合は、代わりに転送を使用します(JSFがデフォルトで使用します)が、とにかく同じページに固執するため、これはajaxで開始されたリクエストでは機能しません。リダイレクトを伴う応答のみが、JavaScriptを使用してウィンドウの場所を変更するようにAjaxに強制します。

新しいリクエストでいくつかのパラメータを保持したい場合は、それらをリクエストパラメータとして渡す必要があります。例えば

externalContext.redirect("nodeMgmt.jsf?foo=bar");

それらをBeanの管理プロパティとして設定します。

于 2011-05-16T17:03:21.737 に答える