可以在整个 Web 应用程序中重用。
要创建定制的检验器,需要执行以下步骤:
创建一个实现 Validator 接口(javax.faces.validator.Validator)的类。
实现 validate() 方法。
在 faces-config.xml 文件中注册定制的检验器。
在 JSP 中使用 <f:validator/> 标记。
我们来逐一介绍这些步骤,并提供创建定制检验器的示例代码。
步骤 1:实现 Validator 接口
第一步是实现 Validator 接口,见清单 36:
清单 36. 实现 Validator 接口
package com.arcmind.validators;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ZipCodeValidator implements Validator {
/** Accepts zip codes like 85710 */
private static final String ZIP_REGEX = "[0-9]{5}";
/** Optionally accepts a plus 4 */
private static final String PLUS4_OPTIONAL_REGEX = "([ |-]{1}[0-9]{4})?";
private static Pattern mask = null;
static {
mask = Pattern.compile(ZIP_REGEX + PLUS4_OPTIONAL_REGEX);
}
步骤 2:实现 validate() 方法
接下来,需要实现 validate() 方法,见清单 37:
清单 37. 实现 validate() 方法
public class ZipCodeValidator implements Validator {
...
public void validate(FacesContext context, UIComponent component,
Object value) throws ValidatorException {
/* Get the string value of the current field */
String zipField = (String) value;
/* Check to see if the value is a zip code */
Matcher matcher = mask.matcher(zipField);
if (!matcher.matches()) {
FacesMessage message = new FacesMessage();
message.setDetail("Zip code not valid");
message.setSummary("Zip code not valid");
message.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(message);
}
}
}
步骤 3:注册定制检验器
现在,您应该对向 FacesContext 注册定制检验器的代码很熟悉了(见清单 38):
清单 38. 在 faces-config.xml 中注册定制检验器
<validator>
<validator-id>arcmind.zipCode</validator-id>
<validator-class>com.arcmind.validators.ZipCodeValidator</validator-class>
</validator>
步骤 4:在 JSP 中使用 <f:validator> 标记
<f:validator/> 标记声明使用 zipCode 检验器,见清单 39:
清单 39. 在 JSP 中使用 <f:validator> 标记
<%-- zip --%>
<h:outputLabel value="Zip" for="zip" accesskey="zip" />
<h:inputText id="zip" size="5"
value="#{contactController.contact.zip}">
<f:validator validatorId="arcmind.zipCode"/>
</h:inputText>
<h:message for="zip" errorClass="errorClass" />
总之,创建定制检验器是非常容易的,而且这些检验器可以跨许多应用程序重用。缺点是必须创建一 个单独的类,并在 faces 上下文中管理检验器的注册 |