JSF验证示例教程–验证器标签,定制验证器

时间:2020-02-23 14:33:46  来源:igfitidea点击:

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方法,并实现了自己的逻辑来验证输入字段。

运行该应用程序,然后查看输出.