Primefaces inputMask服务器端验证

For*_*esR 3 validation jsf server-side primefaces input-mask

当使用一个组件,我们指定如何使用验证它required,maxlength或者validator那些被确认这是伟大的服务器上执行.

使用Primefaces时,inputMask我们可以指定一个掩码.掩码让我们认为用户输入将始终与此掩码匹配.不幸的是情况并非如此,我们必须编写代码validator以确保用户输入将是我们想要的方式.因此,除非我遗漏了某些内容,否则"仅客户端"行为inputMask恰好足以向用户提供有关如何填充字段的提示.

是否存在可以配对的通用 validator,p:inputMask以确保用户输入真正与掩码匹配?

Bal*_*usC 5

PrimeFaces不提供开箱即用.

然而,使用字符数组上的简单for循环将掩模图案转换为正则表达式图案应该是相对微不足道的.然后,您可以使用此正则表达式模式来验证该值.

例如

<p:inputMask ... validator="maskValidator">
Run Code Online (Sandbox Code Playgroud)

@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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,验证器使用未转换的提交值,而不使用传入的第3个参数,该参数可能(隐式)预先转换,因此具有可能不同的toString()表示.