validation - Primefaces inputMask 服务器端验证

标签 validation jsf primefaces server-side input-mask

当使用一个组件时,我们指定如何使用 requiredmaxlengthvalidator 来验证它,这些验证是在服务器上强制执行的这很棒。

当使用 Primefaces inputMask 时,我们可以指定一个掩码。掩码让我们认为用户输入将始终匹配这个掩码。不幸的是,情况并非如此,我们必须编写一个 validator 来确保用户输入符合我们的要求。因此,除非我遗漏了什么,inputMask 的“仅限客户端”行为足以向用户提供有关如何填写字段的提示。

是否有通用验证器可以与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() 表示。

关于validation - Primefaces inputMask 服务器端验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29214214/

相关文章:

jsf - Spring 安全中的ajax

java - SQL异常 : No value specified for parameter 1

reactjs - 文本字段的 React-hook-form 条件验证,基于是否选中另一个复选框?

c# - 创建自定义验证属性 c# 服务器端

orm - 哪个 Web2.0 框架与 JPA2 集成得最好?

java - 如何聚焦 p :selectBooleanButton component using tab key?

JSF SelectMany 复选框,绑定(bind)到子列表

java - Primefaces p :ajaxStatus onerror not called

validation - 使用 Vue 2 进行客户端表单验证

validation - 在具有多个操作的类中具有多个验证功能