当前位置: 首页 > 知识库问答 >
问题:

验证器regex模式输入只接受2-5位数的数字

姬高澹
2023-03-14
<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'必须是一个介于-2147483648和2147483647之间的数字。例如:9346”,而它应该显示“仅数字字符”。

我做错了什么?

共有1个答案

秦宏硕
2023-03-14

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

这是JSF builtinIntegerConverter的默认转换错误消息。当您将输入字段绑定到类型为integer或其基本对应项intbean属性时,它将透明地发挥作用。JSF转换器将在JSF验证器之前运行。在任何转换错误时,验证器都不会运行。换句话说,您根本不需要根据数值regex模式进行验证。

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

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

此外,长度(范围)验证也可以通过JSF builtin 来完成。

<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()是不好的做法。别那么做。您应该将提供的value参数强制转换为模型中声明的实际类型(bean属性)。然后您很快就会意识到验证的某些部分是不必要的。

Integer number = (Integer) value;

而且,matcher实例不是线程安全的。您不应该将它声明为类的实例变量,该类的实例可以跨多个线程共享。

 类似资料:
  • 我是JAVA的新手,文本字段是否可以只接受数字输入?是否也有可能在代码内部有一个等式?例如:(毛额*10) 下面是我希望有数值输入的代码://Display private class Handler implements ActionListener{public void actionPerformed(ActionEvent e){

  • 问题内容: 我是这个C ++世界的新手,正在尝试为数字密码编写输入验证功能。这是我到目前为止所得到的: 对于不正确的值,它工作得很好,但在有效输入时不会中断循环。知道我在这里缺少什么吗?干杯!! James Kanze脚本的ErroR: 新代码: 使用 和 验证作为字符串 感谢所有人(尤其是James Kanze)的帮助。这件事在这里很有效。 那里还有进一步改进的空间吗?干杯!! 问题答案: 这看

  • 我有一个只接受数字的mobileNumber正则表达式“[1-9][0-9]*”<但是我需要在开始时有一个可选的。但用户可能不会在开始时输入 例如9089098909 例如9089098909 例如919089098909 我最多可以接受13个字符<我正在做这个。谁能告诉我怎么解决这个问题吗?

  • 如何验证只有2位数字的输入数字,并允许用户使用JQuery输入点数字? 用户可以输入0到99个数字和点数字 比如( 0.1(3位) 3.14(4位数字) 98.1212178623445243(更多数字) 等......) https://jsfiddle.net/kwcft9bq/ 我试着用 但最后还是不行 有什么想法吗???非常感谢。

  • 本文向大家介绍JS验证 只能输入小数点,数字,负数的实现方法,包括了JS验证 只能输入小数点,数字,负数的实现方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上就是小编为大家带来的JS验证 只能输入小数点,数字,负数的实现方法全部内容了,希望大家多多支持呐喊教程~

  • 问题内容: Python如何接受用户输入,并验证? 问题答案: 完成此操作的最简单方法是将方法置于循环中。当输入错误时使用,当你感到满意时使用。 当你的输入可能引发异常时 使用和检测用户何时输入了无法解析的数据。 实施你自己的验证规则 如果要拒绝Python可以成功解析的值,则可以添加自己的验证逻辑。 结合异常处理和自定义验证 以上两种技术都可以组合成一个循环。 将其全部封装在一个函数中 如果你需