关于定制validator
2012-06-26(Tuesday) 00:00
一个时刻字段,要求输入00:00-12:60这样的时刻范围
使用如下的正则表达式,过滤掉了不合规则的数字之后,还差一个逻辑,结束时刻不能小于开始时刻,比如:10:00-9:00这样的输入也是不合法的。正则太折磨眼力了,应该也是可以做到这点的吧,为了偷懒,就定制个validator来处理这个点。
<af:validateRegExp pattern="([0-1][0-9]|2[0-4])\:([0-5][0-9]|60)\-([0-1][0-9]|2[0-4])\:([0-5][0-9]|60)" messageDetailNoMatch="请输入时刻,例如 00:00-24:60 " hint="请输入时刻,例如 00:00-24:60"/>
package com.adfkf.validators;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import org.apache.myfaces.trinidad.component.UIXInput;
public class ValidatorTime implements Validator {
public ValidatorTime() {
super();
}
public void validate(FacesContext facesContext, UIComponent uiComponent,
Object object) {
String value = null;
String a, b, c, d = null;
Boolean bool = false;
if ((facesContext == null) || (uiComponent == null)) {
throw new NullPointerException();
}
if (!(uiComponent instanceof UIXInput)) {
return;
}
if (null == object) {
return;
}
//12:00-23:00
value = object.toString();
if (value != null && value.length() == 11) {
a = value.substring(0, 2);
b = value.substring(3, 5);
c = value.substring(6, 8);
d = value.substring(9, 11);
try {
Integer intA = Integer.valueOf(a);
Integer intB = Integer.valueOf(b);
Integer intC = Integer.valueOf(c);
Integer intD = Integer.valueOf(d);
if (intC > intA || (intA == intC && intD > intB)) {
bool = true;
} else {
bool = false;
}
} catch (Exception e) {
bool = false;
}
}
if (!bool) {
FacesMessage message = new FacesMessage();
message.setDetail("开始时刻大于结束时间");
message.setSummary("时刻输入有误");
message.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(message);
}
}
}
Step2 在faces-config.xml中注册这个validator
<validator>
<validator-id>validateTime</validator-id>
<validator-class>com.adfkf.validators.ValidatorTime</validator-class>
</validator>
<af:inputText value="#{row.bindings.ReimTime.inputValue}" disabled="#{sessionScope.flag}"
label="#{bindings.CostDetailVO.hints.ReimTime.label}"
required="#{bindings.CostDetailVO.hints.ReimTime.mandatory}"
shortDesc="#{bindings.CostDetailVO.hints.ReimTime.tooltip}"
id="id2">
<af:validateRegExp pattern="([0-1][0-9]|2[0-4])\:([0-5][0-9]|60)\-([0-1][0-9]|2[0-4])\:([0-5][0-9]|60)" messageDetailNoMatch="请输入时刻,例如 00:00-24:60 " hint="请输入时刻,例如 00:00-24:60"/>
<f:validator validatorId="validateTime"/>
</af:inputText>