42

私の JSF/Facelets アプリでは、フォームの一部を簡略化したものを次に示します。

<h:form id="myform">
  <h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" />
  <h:message class="error" for="newPassword1" />
  <h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" />
  <h:message class="error" for="newPassword2" />
  <h:commandButton value="Continue" action="#{createNewPassword.continueButton}" />
</h:form>

continueButton() メソッドで起こっていることに基づいて、特定の h:message タグにエラーを割り当てられるようにしたいと考えています。newPassword と newPassword2 では、異なるエラーを表示する必要があります。結果を (DB から) 配信するメソッドは continueButton() メソッドで実行され、コストがかかりすぎて 2 回実行できないため、バリデーターは実際には機能しません。

ページにはさまざまなエラー メッセージを表示する必要がある複数の場所があるため、h:messages タグを使用できません。これを試したところ、ページにすべてのメッセージが重複して表示されました。

私はこれを最善の推測として試しましたが、運はありません:

public Navigation continueButton() {
  ...
  expensiveMethod();
  if(...) {
    FacesContext.getCurrentInstance().addMessage("newPassword", new FacesMessage("Error: Your password is NOT strong enough."));
  }
}

私は何が欠けていますか?どんな助けでも大歓迎です!

4

8 に答える 8

58

FacesContext.addMessage(String, FacesMessage)には、 idではなく、コンポーネントのclientId必要です。理由が気になる場合は、コントロールを dataTable の子として、行ごとに同じコントロールで異なる値をスタンプすることを考えてみてください。行ごとに異なるメッセージを出力することが可能です。IDは常に同じです。clientId は行ごとに一意です。

したがって、「myform:mybutton」は正しい値ですが、これをハードコーディングすることはお勧めできません。ルックアップは、ビューとビジネス ロジックの間の結合を減らし、ポートレットのようなより制限的な環境で機能するアプローチになります。

<f:view>
  <h:form>
    <h:commandButton id="mybutton" value="click"
      binding="#{showMessageAction.mybutton}"
      action="#{showMessageAction.validatePassword}" />
    <h:message for="mybutton" />
  </h:form>
</f:view>

マネージド Bean のロジック:

/** Must be request scope for binding */
public class ShowMessageAction {

    private UIComponent mybutton;

    private boolean isOK = false;

    public String validatePassword() {
        if (isOK) {
            return "ok";
        }
        else {
            // invalid
            FacesMessage message = new FacesMessage("Invalid password length");
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(mybutton.getClientId(context), message);
        }
        return null;
    }

    public void setMybutton(UIComponent mybutton) {
        this.mybutton = mybutton;
    }

    public UIComponent getMybutton() {
        return mybutton;
    }
}
于 2008-11-26T18:44:41.093 に答える
25

誰かが興味を持っている場合に備えて、私はあなたのすべての回答を組み合わせてこれを理解することができました!

これはFaceletにあります:

<h:form id="myform">
  <h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" />
  <h:message class="error" for="newPassword1" id="newPassword1Error" />
  <h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" />
  <h:message class="error" for="newPassword2" id="newPassword2Error" />
  <h:commandButton value="Continue" action="#{createNewPassword.continueButton}" />
</h:form>

これは continueButton() メソッドにあります。

FacesContext.getCurrentInstance().addMessage("myForm:newPassword1", new FacesMessage(PASSWORDS_DONT_MATCH, PASSWORDS_DONT_MATCH));

そしてそれはうまくいきます!助けてくれてありがとう!

于 2008-11-25T21:57:26.273 に答える
6

また、addMessage() への呼び出しに FormID を含める必要があります。

 FacesContext.getCurrentInstance().addMessage("myform:newPassword1", new FacesMessage("Error: Your password is NOT strong enough."));

これでうまくいくはずです。

よろしく。

于 2008-11-25T14:44:29.720 に答える
4

次のことを覚えておいてください。

FacesContext context = FacesContext.getCurrentInstance();
context.addMessage( null, new FacesMessage( "The message to display in client" ));            

も有効です。最初のパラメーターとしてnullを指定すると、フォーム全体に適用されるからです。

詳細: coreservlets.com //時代遅れ

于 2012-07-10T23:25:47.817 に答える
2

JSFは野獣です。何か不足している可能性がありますが、目的のメッセージを Bean のプロパティに保存し、outputText を介してプロパティを表示することで、同様の問題を解決していました。

<h:outputText
    value="#{CreateNewPasswordBean.errorMessage}"
    render="#{CreateNewPasswordBean.errorMessage != null}" />
于 2008-11-24T23:23:53.683 に答える
1

私はこれを最善の推測として試しましたが、運はありません:

それは私には正しく見えます。メッセージの重大度を明示的に設定しようとしましたか? また、ID はコンポーネントの ID と同じである必要があると思います (つまり、例のように newPassword ではなく、ID の場合は newPassword1 または newPassword2 を使用する必要があります)。

FacesContext.getCurrentInstance().addMessage("newPassword1", 
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Message"));

次に<h:message for="newPassword1" />、JSF ページにエラー メッセージを表示するために使用します。

于 2008-11-25T10:07:40.420 に答える
1

グーグル中にこれを見つけました。2 番目の投稿では、JSF のさまざまなフェーズについて指摘しているため、エラー メッセージが失われる可能性があります。また、id が newPassword のオブジェクトがないため、「newPassword」の代わりに null を試してください。

于 2008-11-24T23:10:48.890 に答える