次の問題があります。PIN のみを提供する場合はフォームを使用します。4桁の数字かどうかをチェックするバリデーターがあります。次に、送信時のアクションが、データベースに PIN が存在するかどうかを確認するメソッドに設定されます。そうでない場合は、message = "no PIN"; を行います。フォームの下の出力ラベルでメッセージを使用しました。以前は null だったので、メッセージはありませんでした。「PINなし」に変わりますが、たとえば「12as」PINを入力してもエラーメッセージが消えず、バリデーターが処理するため、送信ボタンを再度クリックした後、クリアする必要があります。このような状況をどのように実装すればよいですか?このような状況で出力ラベルを使用するのは間違っているのでしょうか?
2 に答える
4
アクション メソッドで検証を実行しないでください。実際のバリデーターを使用する必要があります。
Validator
それに応じてインターフェースを実装するだけです。例えば
@FacesValidator("pinValidator")
public class PinValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String pin = (String) value;
if (pin == null || pin.isEmpty()) {
return; // Let required="true" deal with it if necessary.
}
if (!pin.matches("\\d{4}")) {
throw new ValidatorException(new FacesMessage("PIN must be 4 digits"));
}
if (!somePinService.exists(pin)) {
throw new ValidatorException(new FacesMessage("PIN is unknown"));
}
}
}
次のように使用します。
<h:outputLabel for="pin" value="PIN" />
<h:inputText id="pin" value="#{bean.pin}" validator="pinValidator" />
<h:message for="pin" />
バリデーター例外のfacesメッセージは、バリデーターが起動され<h:message>
たコンポーネントに関連付けられて終了します。
フォームの送信に ajax を使用している場合は、ajax レンダリングでもメッセージが考慮されることを忘れないでください。
具体的な問題とは関係ありませんが、JSFはフォーム要素( 、など)にラベルを付ける<h:outputLabel>
ための HTML<label>
要素を生成します。検証メッセージなどの任意のテキストを表示することはまったく意図されていません。今のところ JSF は脇に置いて、基本的な HTML の学習を開始することをお勧めします。このようにして、目的の HTML 出力を得るためにどの JSF コンポーネントを選択すればよいかをよりよく理解できます。<input>
<select>
于 2013-05-10T22:43:32.257 に答える