我想在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;。
我做错了什么?
答案 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。你不应该把它声明为一个类的实例变量,它的实例可以跨多个线程共享。