【问题标题】:Validator regex pattern input accept only a number with 2-5 digits验证器正则表达式模式输入仅接受 2-5 位数字
【发布时间】:2015-08-23 07:02:05
【问题描述】:

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

小脸

<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
@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);
        }  
    }     
}

当我插入一位数字时,验证器正常工作并显示消息“最小长度 2 个数字”。但是当我插入一些字母而不是像“eee3”这样的数字时,验证器会显示以下消息:“num1: 'eee3' must be a number between -2147483648 and 2147483647. Example: 9346”, 当它应该显示“只有数字字符”。

我做错了什么?

【问题讨论】:

  • 为什么不直接将输入转换为数字并验证其是否 >99 和

标签: regex validation jsf


【解决方案1】:

但是当我插入一些字母而不是像“eee3”这样的数字时,验证器会显示以下消息:“num1: 'eee3' must be a number between -2147483648 and 2147483647. Example: 9346”

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

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

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

此外,长度(范围)验证也可以通过 JSF 内置 &lt;f:validateLongRange&gt; 完成。

<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>

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

Integer number = (Integer) value;

并且,Matcher 实例是not thread safe。您不应该将其声明为实例可以跨多个线程共享的类的实例变量。

【讨论】:

  • 如何知道某些东西是线程不安全的,尽管在这种情况下明确指出,“此类的实例对于多个并发线程使用是不安全的。”?
  • @Tiny: Matcher 是有状态的并且不同步。 IE。它具有实例变量,可以通过不同步的实例方法进行操作。
猜你喜欢
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多