コンポーネントを使用するときは、次のようにコンポーネントを検証する方法を指定します required
, maxlength
または validator
そしてそれらの検証は素晴らしいサーバー上で実施されます。
Primefaceを使用する場合 inputMask
マスクを指定できます。マスクにより、ユーザー入力は常にこのマスクと一致すると考えられます。残念ながら、そうではありません。 validator
ユーザーの入力が正しい方法になるようにします。それで、私が何かを見逃していない限り、 "クライアントサイドのみ"の振る舞いは inputMask
どのようにフィールドを埋めるかについてのヒントをユーザーに提供するのに十分なだけです。
ありますか ジェネリック validator
と組み合わせることができるより p:inputMask
ユーザー入力が本当にマスクと一致していることを確認するにはどうすればいいですか?
回答:
回答№1は5PrimeFacesは箱から出してそれを提供していません。
ただし、文字配列に対する単純なforループを使用してマスクパターンを正規表現パターンに変換するのは比較的簡単なはずです。その後、この正規表現パターンを使用して値を検証できます。
例えば。
<p:inputMask ... validator="maskValidator">
〜と
@FacesValidator("maskValidator")
public class MaskValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String submittedValue = context.getExternalContext().getRequestParameterMap().get(component.getClientId(context));
if (submittedValue == null || submittedValue.isEmpty()) {
return; // Let @NotNull / required="true" handle.
}
InputMask input = (InputMask) component;
String mask = input.getMask();
StringBuilder regex = new StringBuilder();
for (char c : mask.toCharArray()) {
switch (c) {
case "a": regex.append("[a-zA-Z]"); break;
case "9": regex.append("[0-9]"); break;
case "?": case "+": case "*": regex.append(c); break;
default: regex.append(Pattern.quote(Character.toString(c))); break;
}
}
if (!submittedValue.matches(regex.toString())) {
throw new ValidatorException(new FacesMessage(submittedValue + " does not match " + mask));
}
}
}
バリデータは、渡された3番目の引数ではなく、変換されていない送信済みの値を処理します。これは、(暗黙的に)事前に変換されている可能性があります。 toString()
表現。