4

私のxhtmlページコード:

<h:outputLabel value="Email address: " />
<h:inputText id="email" value="#{userBean.emailAddressBeingEdited}" required="true" requiredMessage="*" />
<h:message for="email" id="emailM"/>

私のJavaコード:

FacesContext.getCurrentInstance().addMessage("email", new FacesMessage("Email already in use"));

h:inputTextにh:messageをネストしようとしましたが、うまくいきませんでした。さらに詳しい情報が必要な場合は、お問い合わせください。

4

2 に答える 2

4

指定するaddMessage()クライアントIDは、コンポーネントIDではなく、実際のクライアントIDである必要があります。入力コンポーネントのクライアントIDには、通常、親フォームコンポーネントのIDが接頭辞として付けられます。どのJSFコンポーネントが実装され、クライアントIDがどのように生成されるかを覚えていない初心者にとってNamingContainer、実際のクライアントIDを見つける最も簡単な方法は、ブラウザーでページを開き、そのソースを表示して、生成されたHTML<input type="text">要素を見つけ、最後にそのを取得することidです。<h:form>のIDを指定した場合はformId、になりますformId:email。これは、で指定する必要がある実際のクライアントIDですaddMessage()

context.addMessage("formId:email", message);

適切なクライアントIDを指定しない場合、メッセージは未処理のままになります。JSFプロジェクトステージがに設定されている場合、JSFはDevelopmentそれを本文の最後にある「未処理のメッセージ」のリストに自動的に追加します。これはあなたが見ているものです。生成されたHTMLソースを表示して、自分で確認します。これは、自動生成されたHTMLリスト<ul id="javax_faces_developmentstage_messages">です。


具体的な問題とは関係なく、 JSFBeanアクションメソッドで検証を行っているようです。これは正しい方法ではありません。これにはを使用する必要がありますValidator。これにより、クライアントIDについて心配する必要がなくなります。をスローする必要がありValidatorExceptionますFacesMessage。例えば

@FacesValidator("uniqueEmailValidator")
public class UniqueEmailValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        // ...

        if (emailIsAlreadyInUse) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Email is already in use", null));
        }
    }

}

<f:validator validatorId="uniqueEmailValidator" />次に、入力コンポーネント内として登録します。

于 2012-05-12T17:10:54.803 に答える
3
<h:panelGrid columns="3">
   <h:outputLabel value="Email address: " />
   <h:inputText id="email" value="#{userBean.emailAddressBeingEdited}" required="true" requiredMessage="*" />
   <h:message for="email" id="emailM"/>
</h:panelGrid>

これ??

于 2012-05-12T16:50:48.710 に答える