Primefaces inputMask 服务器端验证
Primefaces inputMask server side validation
使用组件时,我们指定如何使用 required
、maxlength
或 validator
验证它,并且这些验证是在服务器上强制执行的,这很棒。
使用 Primefaces inputMask
时,我们可以指定一个掩码。掩码让我们认为用户输入将始终匹配这个掩码。不幸的是,情况并非如此,我们必须编写 validator
代码以确保用户输入符合我们的要求。因此,除非我遗漏了什么,否则 inputMask
的 "client-side only" 行为足以向用户提供有关如何填写字段的提示。
是否有 generic validator
可以与 p:inputMask
配对以确保用户输入确实与掩码匹配?
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));
}
}
}
请注意,验证器使用的是未转换的提交值,而不是传入的第三个参数,后者可能会事先(隐式)转换,因此可能具有不同的 toString()
表示形式。
使用组件时,我们指定如何使用 required
、maxlength
或 validator
验证它,并且这些验证是在服务器上强制执行的,这很棒。
使用 Primefaces inputMask
时,我们可以指定一个掩码。掩码让我们认为用户输入将始终匹配这个掩码。不幸的是,情况并非如此,我们必须编写 validator
代码以确保用户输入符合我们的要求。因此,除非我遗漏了什么,否则 inputMask
的 "client-side only" 行为足以向用户提供有关如何填写字段的提示。
是否有 generic validator
可以与 p:inputMask
配对以确保用户输入确实与掩码匹配?
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));
}
}
}
请注意,验证器使用的是未转换的提交值,而不是传入的第三个参数,后者可能会事先(隐式)转换,因此可能具有不同的 toString()
表示形式。