JSF验证示例教程–验证器标签,定制验证器
JSF验证模型定义了一组用于验证UI组件的标准类。
JSF库定义了一组与javax.faces.validator.Validator
实现相对应的核心标签。
除了标准的错误消息验证模型,我们还可以定义自定义验证。
JSF中的验证可以分为命令式和声明式。
JSF验证–声明式验证器
使用JSF标准验证器或者Bean验证器触发的验证属于声明性类型。
JSF标准验证器的示例包括长度验证器,必需验证器等。
考虑标准验证器的示例。
创建mobile.xhtml为
mobile.xhtml
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="https://www.w3.org/1999/xhtml" xmlns:h="https://java.sun.com/jsf/html"> <h:head> </h:head> <h:body> <h3>Add Mobile Details</h3> <h:form> <h:panelGrid columns="3"> <h:outputLabel for="mname">Mobile Name:</h:outputLabel> <h:inputText id="mname" required="true" requiredMessage="Mobile Name is mandatory"></h:inputText> <br> <br> <h:outputLabel for="color">Color:</h:outputLabel> <h:inputText id="color" required="true"></h:inputText> <br> <br> <h:outputLabel for="model">Model Number:</h:outputLabel> <h:inputText id="model"></h:inputText> <br> <br> <h:commandButton value="Submit"></h:commandButton> </h:panelGrid> </h:form> </h:body> </html>
其中我们将required属性设置为true,这使该字段成为必填字段,并在color字段和移动名称字段中为用户定义的消息中触发自定义消息" value is required。
运行该应用程序,然后按提交按钮,您将看到以下输出。
JSF命令式验证
标准验证消息并非在所有情况下都足够,有时可能需要复杂的验证。
即时验证允许用户通过以下方式进行验证:
- 从Bean方法触发验证
- 在运行时在类中使用注释@FacesValidator
从Bean方法触发验证在这种类型的验证中,我们在Bean中编写一个方法来验证UIComponents,并通过inputText标记中的validator属性从jsf页面调用此方法。
现在,让我们来看一个从Bean触发验证的示例。
mob.xhtml
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="https://www.w3.org/1999/xhtml" xmlns:h="https://java.sun.com/jsf/html"> <h:head> </h:head> <h:body> <h3>Add Mobile Details</h3> <h:form> <h:outputLabel for="mno">Model Number:</h:outputLabel> <h:inputText id="mno" value="#{mobile.mno}" required="true" size="4" disabled="#{mobile.mno}" validator="#{mobile.validateModelNo}"> </h:inputText> <h:commandButton value="Submit"></h:commandButton> </h:form> </h:body> </html>
在此页面中,我们将在Validator标签属性中调用Java Bean的validateModelno方法。
创建" Mobile.java"为
package com.theitroad.jsf.bean; import java.io.Serializable; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.component.UIComponent; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; @ManagedBean @SessionScoped public class Mobile implements Serializable { private static final long serialVersionUID = -7250065889869767422L; //@NotNull(message="Please enter the model number") private String mno; public String getMno() { return mno; } public void setMno(String mno) { this.mno = mno; } public void validateModelNo(FacesContext context, UIComponent comp, Object value) { System.out.println("inside validate method"); String mno = (String) value; if (mno.length() < 4) { ((UIInput) comp).setValid(false); FacesMessage message = new FacesMessage( "Minimum length of model number is 4"); context.addMessage(comp.getClientId(context), message); } } }
其中我们正在检查型号no的长度,如果长度小于4,则将消息指定为"型号最小长度为4"。
现在,运行产生以下输出的应用程序。
在Bean中使用@FacesValidator –自定义JSF验证程序
在此方法中,我们使用@FacesValidator批注,指定验证器的名称并通过覆盖validate方法来实现Validator。
mobvalidator.xhtml
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="https://www.w3.org/1999/xhtml" xmlns:h="https://xmlns.jcp.org/jsf/html" xmlns:f="https://java.sun.com/jsf/core"> <h:head> </h:head> <h:body> <h:form> <h3>Validation using Faces validator</h3> <h:outputLabel for="mno" value="Model Number: " <h:inputText id="mno" value="#{mobileValidator.mno}"> <f:validator validatorId="mobileValidator" </h:inputText> <h:message for="mno" style="color:blue" <p></p> <h:commandButton value="Submit"></h:commandButton> </h:form> </h:body> </html>
在此,我们在<f:validator>标记的validateatorId属性中调用名为" mobileValidator"的自定义验证器。
创建MobileValidator.java
为
package com.theitroad.jsf.bean; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.validator.FacesValidator; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; @ManagedBean @SessionScoped @FacesValidator("mobileValidator") public class MobileValidator implements Validator { private String mno; public String getMno() { return mno; } public void setMno(String mno) { this.mno = mno; } int maximumlength = 6; public MobileValidator() { } @Override public void validate(FacesContext fc, UIComponent uic, Object obj) throws ValidatorException { String model = (String) obj; if (model.length() > 6) { FacesMessage msg = new FacesMessage( " Maximum Length of 6 is exceeded.Please enter values within range"); msg.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(msg); } } }
其中我们重写了标准的validate方法,并实现了自己的逻辑来验证输入字段。
运行该应用程序,然后查看输出.