1

以前の質問で、BalusC は commandButton の代わりにボタンが非 ajax ナビゲーションにどのように役立つかについて良いアドバイスをくれました。特に、ユーザーがページをブックマークするのに役立つ http: 位置の宛先アドレスを更新します。

問題が発生するまで、この情報を有利に利用しようとしました。ボタンで、結果がnullになることを確認するためにoutcome="#{backing.something}"を使用しようとしました。action="#{}" はボタンが押されたときにのみ評価されるというタイミングの問題のように見えますが、ページが読み込まれたときにチェックされる固定文字列が必要なようです。

そこで、ajax="false" で commandButton に戻りました。これには、ナビゲーションアドレスが、移動先のページではなく、元のページであるという問題があります。これはユーザーにとって間違ったブックマークです。

私の学習演習で、stackoverflow で受けたすべての助けに感謝します。宜蘭

4

1 に答える 1

3

<h/p:button outcome>は、Bean アクション メソッドを呼び出すためのものではなく、結果文字列を直接含めるためのものです。そこにあるELは、値式としてすぐに評価されます。したがって、その背後にあるメソッドは、<h/p:button>.

特定のケースでは、基本的にナビゲーションで Bean アクション メソッドを呼び出す方法が 2 つあります。ナビゲーションが行われる前にそれを呼び出す必要があり、エンドユーザーが GET 要求を再度開いたりリロードしたりするたびにアクションが再度呼び出されることを意図していない場合は、それを POST-Redirect-GET 要求にします。faces-redirect=trueクエリ文字列構文で結果値に追加するだけです。

例えば

<p:commandButton action="#{bean.submit}" ... />

public String submit() {
    // ...

    return "nextpage?faces-redirect=true";
}

このようにして、ブラウザーは POST 後にターゲット ページにリダイレクトされるため、エンドユーザーはターゲット URL がアドレス バーに反映されているのを確認できます。

または、エンドユーザーが GET リクエストを再度開いたり再ロードしたりするたびにアクションを呼び出す必要がある場合は、preRenderView代わりに、リクエスト/ビュー スコープのバッキング Bean の (ポスト) コンストラクターまたはリスナー メソッドでジョブを実行します。

例えば

<p:button outcome="nextpage" ... />

@ManagedBean
@RequestScoped
public class NextpageBacking {

    public NextpageBacking() {
        // In constructor.
    }

    @PostConstruct
    public void onPostConstruct() {
        // Or in postconstructor (will be invoked after construction AND injection).
    }

    public void onPreRenderView() {
        // Or before rendering the view (will be invoked after all view params are set).
    }

    // ...
}

レンダリング前のビュー リスナー メソッドは、次のように定義する必要があります。nextpage

<f:event type="preRenderView" listener="#{nextpageBacking.onPreRenderView}" />

以下も参照してください。

于 2012-06-03T12:39:51.433 に答える