/ / Primefaces inputMaskサーバー側検証 - 検証、jsf、primefaces、サーバー側、入力マスク

Primefaces inputMaskサーバー側の検証 - 検証、jsf、primefaces、サーバー側、入力マスク

コンポーネントを使用するときは、次のようにコンポーネントを検証する方法を指定します required, maxlength または validator そしてそれらの検証は素晴らしいサーバー上で実施されます。

Primefaceを使用する場合 inputMask マスクを指定できます。マスクにより、ユーザー入力は常にこのマスクと一致すると考えられます。残念ながら、そうではありません。 validator ユーザーの入力が正しい方法になるようにします。それで、私が何かを見逃していない限り、 "クライアントサイドのみ"の振る舞いは inputMask どのようにフィールドを埋めるかについてのヒントをユーザーに提供するのに十分なだけです。

ありますか ジェネリック validator と組み合わせることができるより p:inputMask ユーザー入力が本当にマスクと一致していることを確認するにはどうすればいいですか?

回答:

回答№1は5

PrimeFacesは箱から出してそれを提供していません。

ただし、文字配列に対する単純な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() 表現。