验证器正则表达式模式输入仅接受2-5位数字

时间:2015-06-08 17:27:27

标签: regex validation jsf

我想在JSF应用程序中使用自定义Validator验证用户的输入数据。插入的数据必须是2到5位数字。

的facelet

<h:inputText id="num1" label="num1" required="true" size="5" maxlength="5" 
styleClass="#{component.valid ? '' : 'validation-failed'}"
value="#{sumaManagedBean.number1}"
requiredMessage="You must enter a value">
<f:validator validatorId="validators.NumberValidator"/>    
</h:inputText>
<h:message for="num1" />

ManagedBean

@ManagedBean
@SessionScoped
public class SumaManagedBean implements Serializable
{

    int number1;

    public SumaManagedBean() {
    }

    //Getters and Setters
    public int getNumber1() {
        return number1;
    }

    public void setNumber1(int number1) {
        this.number1 = number1;
    }

    //Methods
}

验证

@FacesValidator("validators.NumberValidator")
public class NumberValidator implements Validator
{
    private static final String NUMBER_PATTERN = "[0-9]{1,5}";

    private Pattern pattern;
    private Matcher matcher;

    public NumberValidator()
    {
        pattern = Pattern.compile(NUMBER_PATTERN);
    }

    @Override
    public void validate(FacesContext context, UIComponent component,Object value) throws ValidatorException 
    {
        String number = value.toString();

        //Only numeric characters
        matcher = pattern.matcher(value.toString());
        if(!matcher.matches())
        {
            FacesMessage msg = new FacesMessage("Only numeric characters");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(msg);

        } 
        //Minimum length 2 numbers
        else if((number.length() < 2))  
        {  
            FacesMessage msg =  new FacesMessage("Minimum length 2 numbers");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(msg);
        }  
    }     
}

当我插入一位数字时,验证器正常工作并显示消息&#34;最小长度为2的数字&#34;。但是当我插入一些字母而不是像#34; eee3&#34;这样的数字时,验证器会显示以下消息:&#34; num1:&#39; eee3&#39;必须是介于-2147483648和2147483647之间的数字。例如:9346&#34;,何时显示&#34;仅数字字符&#34;。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

  

但是当我插入一些字母而不是像“eee3”这样的数字时,验证器会显示以下消息:“num1:'eee3'必须是-2147483648和214748364之间的数字。例如:9346”

这是JSF内置IntegerConverter的默认转换错误消息。将输入字段绑定到类型为Integer的bean属性或其原始对应int时,它将透明地启动。 JSF转换器将在JSF验证器之前运行。在任何转换错误上,验证程序都不会运行。换句话说,您根本不需要验证该数字正则表达式模式。

您可以通过converterMessage属性自定义转换器消息。

<h:inputText value="#{bean.integer}" ... converterMessage="Only numeric characters" />

此外,该长度(范围)验证也可以由JSF内置<f:validateLongRange>完成。

<h:inputText value="#{bean.integer}">
    <f:validateLongRange minimum="10" maximum="99999" />
</h:inputText>

可以通过validatorMessage属性自定义验证程序消息。总而言之,您的输入组件可以使用基本部件,就像这样,没有任何自定义验证器:

<h:inputText value="#{bean.integer}" maxlength="5" required="true"
    requiredMessage="You must enter a value"
    converterMessage="Only numeric characters"
    validatorMessage="Minimum length 2 numbers">
    <f:validateLongRange minimum="10" maximum="99999" />
</h:inputText>
对具体问题

无关,在value.toString()内执行Validator是不好的做法。不要那样做。您应该将提供的值参数强制转换为模型中声明的实际类型(bean属性)。然后,您很快意识到验证的某些部分是不必要的。

Integer number = (Integer) value;

而且,Matcher个实例是not thread safe。你不应该把它声明为一个类的实例变量,它的实例可以跨多个线程共享。