JSFのバリデーションの例のチュートリアルです。バリデータータグ、カスタムバリデーターについて説明します。

JSFのバリデーションモデルは、UIコンポーネントのバリデーションに使用する一連の標準クラスを定義しています。JSFライブラリは、javax.faces.validator.Validatorの実装に対応する一連のコアタグを定義しています。標準のエラーメッセージに加えて、バリデーションモデルではカスタムバリデーションを定義することも可能です。JSFのバリデーションは、命令的なバリデーションと宣言的なバリデーションの2つに分類されます。

JSFのバリデーション – 宣言的バリデータ

JSF標準バリデータやBeanバリデータを使用して発生するバリデーションは、宣言型のタイプに該当します。JSF標準バリデータの例には、Lengthバリデータ、Requiredバリデータなどがあります。標準バリデータの例を考えてみましょう。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>

私たちはここで、必須属性をtrueに設定しています。これにより、フィールドが必須になり、「value is required」というカラーフィールドのカスタムメッセージが表示されます。また、モバイル名フィールドには、必要なメッセージ属性で指定されたユーザー定義のメッセージが表示されます。アプリケーションを実行し、送信ボタンを押すと、以下の出力が表示されます。

JSF の命令型バリデーション

標準のバリデーションメッセージはすべてのケースに十分でなく、時には複雑なバリデーションが必要とされます。命令形バリデーションは、ユーザーがこれを実現できるようにします。

    1. Beanメソッドからのバリデーションの実行

 

    実行時にクラスに@FacesValidatorアノテーションを使用する

Beanメソッドからのバリデーションを実行する。このタイプのバリデーションでは、UIコンポーネントをバリデートするためのメソッドをBeanに書き、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>

このページでは、バリデータタグの属性の中で、Java BeanのvalidateModelnoメソッドを呼び出しています。Mobile.javaを作成してください。

package com.scdev.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);

		}

	}

}

以下の日本語の文について言い換える。:
モデル番号の長さをチェックしており、もし長さが4未満の場合、「最小のモデル番号の長さは4です」というメッセージを指定しています。その後、アプリケーションを実行すると、以下の出力が生成されます。

Bean内で@FacesValidatorを使用する-カスタムJSFバリデーター

この方法では、@FacesValidator注釈を使用し、バリデータの名前を指定し、バリデータを実装し、validateメソッドをオーバーライドします。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>

以下は、日本語での表現です。

この中で、 タグの validatorId 属性に「mobileValidator」という名前のカスタムバリデータを呼び出しています。MobileValidator.java を作成してください。

package com.scdev.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);
		}

	}

}

以下のようなものを日本語で言い換えます。オプションは1つだけで大丈夫です:
ここで、標準のvalidateメソッドをオーバーライドし、入力フィールドの検証に独自のロジックを実装します。アプリケーションを実行し、以下に示す出力を確認してください。最後に、下の画像はプロジェクトの構造を示しています。詳しく学ぶために、プロジェクトを以下のリンクからダウンロードして自由に操作してください。

JSFのバリデーションのサンプルプロジェクトをダウンロードしてください。

コメントを残す 0

Your email address will not be published. Required fields are marked *