次のように、inputText の JSR-303 検証に rich:validator を使用しています。
<h:outputLabel value="#{msgs['label.email']}:"/>
<h:inputText value="#{loginBean.email}" id="email" size="50" validatorMessage="Invalid email address." styleClass="#{component.valid ? '' : 'invalid'}">
<rich:validator />
</h:inputText>
<rich:message for="email" />
検証が失敗すると、inputText のクラスが に変更されinvalid
、コンポーネントの周囲に赤い境界線が表示され、rich:message がメッセージを表示することになっていInvalid email address
ます。無効な電子メール アドレスを入力し、マウス カーソルを inputText の外に移動すると、Invalid email address
メッセージのみが表示されます。UIInput はinvalid
クラスに切り替わらないため、コンポーネントの周りに赤い境界線は表示されません。ただし、送信ボタンをクリックして無効な電子メール アドレスでフォームを送信すると、ページがリロードされたときに inputText ボックスのクラスが変更され、赤枠のコンポーネントとエラー メッセージの両方が表示されます。これはなぜですか?JSR-303 では、フォームが送信される場合とまったく同じようにクライアント側の検証が機能することを要求していませんか?
編集:
以下をinputTextに追加しました。これにより、inputTextのクラスを変更する際の問題が解決されました。
<a4j:ajax event="blur" render="email"/>
しかし、これにより新たな問題が発生しました。現在、エラー メッセージは「スティッキー」ではありません。つまり、無効な電子メールが入力されると、inputText に赤いアウトラインが表示され、予想どおりエラー メッセージが表示されますが、別のコンポーネントに無効な入力を入力すると、そのクラスが「無効」に変更され、エラー メッセージが表示されます。 、「メール」のエラーメッセージが消えます。現在、inputText クラスの変更は正常に機能していますが、メッセージは揮発性であり、別のコンポーネントのエントリが無効になると消えます。