0

コマンド ボタンのアクション属性によって呼び出されるバッキング Bean にアクション メソッドを記述しました。実行が成功すると「null」が返され、それ以外の場合は「エラー」が返されます。私が必要としているのは、アクション メソッドの戻り値に基づいて、JavaScript ダイアログ ボックスに適切なメッセージを表示したいということです。誰でもそれを達成する方法を教えてもらえますか?

4

2 に答える 2

0

JSF 2 を使用しているため、<f:ajax/>ここでいくつかの魔法を使用できます。コマンド ボタン内に次のタグのいずれかをネストします。

<h:commandButton id="yourCmdButton" action="#{yourBean.yourMethod}">
    <f:ajax render="hiddenComponent" onevent="displayMessage">
</h:commandButton>

yourMethod<h:inputHidden/>withにバインドされたフィールドに言及した値を更新する必要がid="hiddenComponent"あり、ajax を介してコンポーネントが更新されます。その後、displayMessagejavascript 関数が呼び出され (onevent関連する jax リクエストのコールバック javascript 関数を定義します)、そのコンポーネントの値をフェッチし、必要に応じてメッセージを表示する必要があります。

一方、いわゆるFlash Scopeを利用できますが、それ自体はスコープではありません。Bean に注入することによって、さまざまな方法でアクセスできます。

@ManagedProperty("#{flash}")
private Flash flash;

//The setter is required
public void setFlash(Flash newFLash) {
    flash = newFlash;
}

または直接取得することにより:

Flash jsfFlash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
jsfFlash.put("errorMsg", "error");
//Or jsfFlash.put("errorMsg", null) if there's no error.

Flash はMap、要求の 1 ステップ前にパラメーターを存続させることを可能にし、POST - Redirect - GET パターンのネイティブ実装をユーザーの努力をほとんど必要とせずに可能にします。

このページでは、フラッシュに直接アクセスして、フラッシュにエラー属性が含まれていない場合にメッセージをレンダリングできます。

<h:panelGroup rendered="#{flash.errorMsg != null}">
    <p>
        Well... it seems an error occured...
    </p>
</h:panelGroup>

何らかの理由でフラッシュ キー文字列にピリオドが含まれている場合は、代わりに次の命名法を使用する必要があることに注意してください。

<h:panelGroup rendered="#{flash['error.message'] != null}">

<h:panelGroup/>そのコンポーネントの親を再レンダリングすることを忘れないでください ( javascript コールバック関数<f:ajax/>なしでタグを使用して)。onevent親の再レンダリングについては、条件付きでレンダリングされたコンポーネントを JSF で直接再レンダリングすることはできないため、最終的には次のようになります。

<h:panelGroup id="messageParentGroup">
    <h:panelGroup rendered="#{flash.errorMsg}">
        ...

<h:commandButton ...>
    <f:ajax render="messageParentGroup"/>
</h:commandButton>

また、コンポーネントのコンテキストも考慮してください。相対パスではなく、そのコンポーネントの絶対パスを定義する必要がある場合があります。

余談ですが、JSF の検証を使用しないのはなぜですか? コンポーネントと一緒にバリデーターメソッドまたは完全に実装されたバリデーターを使用する<h:messages/>方が適切であり、フォーム値の汚染を回避できます (バリデーターが開始され、他のフェーズ間で SetValues が発生するのを防ぐため)。

于 2013-04-02T14:44:17.700 に答える