4

私は問題があります。ページにグローバル エラーがあるかどうかを知る必要があります。これは、2 つの異なるh:messages(エラー コンテナー) があるためです。

<h:messages id="errorMsgsContainer"
layout="table" 
rendered="true"
styleClass="message-container error-message" 
infoClass="info" 
errorClass=" error" warnClass="warn-message warn" globalOnly="true"/>

<h:messages id="errorMsgsContainerValidation"
layout="table" 
styleClass="message-container error-message-validation" 
infoClass="info" 
errorClass="error" globalOnly="false"/>

1 つはビジネス関連のメッセージを表示し、もう 1 つは検証メッセージのみを表示します。messagesビジネス要件のため、2 つ存在します。

messages検証エラー メッセージが生成された場合、タグの 1 つにglobalOnly="true"属性と値のペアがあるため、facelet は正常に動作します。

グローバルのみのエラーが発生したときに問題が発生します。両方のボックスに表示されます。

エラーのいずれかがグローバルかどうかを知りたいので、ユーザーがフォームでグローバル エラーを修正するまで、検証コンテナーを表示しません。

私はそれを介してそれを取得しようとしましFacesContext

FacesContext.getCurrentInstance().getMessageList().get(i).getSeverity()

および他のいくつかのコマンドですが、機能していないようです。

この問題を解決するのを手伝ってください。現在のグローバル メッセージ リストを取得して、グローバル エラーがあるかどうかを知るにはどうすればよいですか?

4

2 に答える 2

3

検証エラー メッセージが生成された場合、メッセージ タグの 1 つに globalOnly="true" 属性と値のペアがあるため、Facelet は正常に動作します。

これは正しくありません。属性と値のペアh:messagesを持つ他のタグで、検証エラーのメッセージが表示されます。globalOnly="false"検証メッセージには常にクライアント ID があり、これはたまたま検証に失敗したフォーム要素の ID であるため、messages非グローバル メッセージの表示を許可するタグに表示されるか、for属性の値が該当する ID。

グローバルのみのエラーが発生したときに問題が発生します。両方のボックスに表示されます。

これは予期される動作です。globalOnly属性の意味を混同していると思います。属性の値globalOnlyが true の場合、グローバル メッセージ (つまり、クライアント ID のないメッセージ) のみが表示されます。値が false の場合、既にキューに入れられている他のメッセージに加えて、グローバル メッセージが表示されます。これは、グローバル メッセージが 2 回表示される理由を説明します。最初のh:messagesタグは、グローバル メッセージのみを表示する必要があるため、グローバル メッセージを表示し、2 番目のタグは、グローバル メッセージを表示できるため、グローバル メッセージを表示します。

この問題を解決するのを手伝ってください。現在のグローバル メッセージ リストを取得して、グローバル エラーがあるかどうかを知るにはどうすればよいですか?

facelet に2 つのタグを引き続き使用する場合は、 を表示するために をキューに入れるときに、 ;の ID を指定する代わりにh:messages、「疑似グローバル」ID を使用できます。次の例の疑似グローバル Id の値は、この場合生成される検証メッセージを持たない (フォームの) 有効なクライアント Id です。FacesMessagenullinputForm

FacesContext.getCurrentInstance().addMessage("inputForm", new FacesMessage(FacesMessage.SEVERITY_INFO, "Added a global message", null));

次に、EL 式を追加してmessages、入力検証メッセージの表示を担当するタグをレンダリングできます。

<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:fn="http://java.sun.com/jsp/jstl/functions">
...
    <h:form id="inputForm">
    ...
    </h:form>
    <h:messages id="psuedoGlobalMessages" for="inputForm" globalOnly="true" infoStyle="color:green" errorStyle="color:red" warnClass="color:orange" />
    <h:messages id="clientMessages" rendered="#{fn:length(facesContext.getMessageList('inputForm')) == 0}" globalOnly="false" infoStyle="color:green" errorStyle="color:red" warnClass="color:orange" />
...

1 つのタグglobalOnlyでのみ属性を使用することに注意してください。属性で指定された EL 式を介して表示するために疑似グローバル メッセージがキューに入れられている場合も、messages同じタグは表示されません。フォームのクライアント ID の代わりに、すべての疑似グローバル メッセージを送信するために特別に作成された非表示のフォーム要素のクライアント ID を使用することもできます。messagesrendered

于 2011-09-22T04:08:15.307 に答える
0

これを試して:

rendered="#{not empty facesContext.getMessageList('inputForm')}

それ以外の:

rendered="#{fn:length(facesContext.getMessageList('inputForm')) == 0}"

Vineet Reynoldsの答えで。

于 2015-07-31T04:47:08.167 に答える