Trang chủHướng dẫnJSF Validator trong Java: Cách triển khai Form Validation chi tiết
Java

JSF Validator trong Java: Cách triển khai Form Validation chi tiết

CyStack blog 4 phút để đọc
CyStack blog11/09/2025
Locker Avatar

Chris Pham

Technical Writer

Locker logo social
Reading Time: 4 minutes

Trong lập trình web với JavaServer Faces (JSF), việc xác thực dữ liệu đầu vào (form validation) là bước quan trọng để đảm bảo tính đúng đắn và an toàn của ứng dụng. JSF cung cấp cơ chế Validator giúp kiểm tra dữ liệu theo nhiều cách khác nhau, từ Declarative Validation bằng các thẻ tích hợp sẵn, đến Imperative Validation thông qua Bean, và cả Custom Validator với annotation @FacesValidator. Bài viết này sẽ hướng dẫn bạn cách sử dụng JSF Validator trong Java với ví dụ chi tiết.

JSF Validator trong Java

Xác thực JSF: Declarative Validator

Các xác thực được kích hoạt thông qua validator tiêu chuẩn của JSF hoặc Bean validator được xếp vào loại declarative.

Ví dụ điển hình là Length validator, Required validator… Để hiểu rõ hơn, bạn hãy tạo tệp mobile.xhtml như sau:

<?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>

Ở đây, thuộc tính required được đặt thành true nên trường trở thành bắt buộc. Khi đó, trường màu sẽ hiển thị thông báo mặc định “value is required”, còn trường tên điện thoại sẽ hiển thị thông báo tùy chỉnh do người dùng định nghĩa trong thuộc tính requiredMessage. Sau khi chạy ứng dụng và nhấn nút submit, kết quả sẽ xuất hiện như hình dưới.

JSF xác thực với thẻ validator và custom validator

JSF Validation, JDF Validator

Xác thực JSF Imperative

Đôi khi chỉ có các thông báo xác thực tiêu chuẩn thôi là chưa đủ, chúng ta sẽ cần các xác thực phức tạp hơn và imperative validation sẽ thực hiện điều này bằng cách:

  1. Kích hoạt xác thực từ phương thức trong Bean
  2. Sử dụng annotation @FacesValidator trong lớp ở thời gian chạy

Kích hoạt xác thực từ phương thức trong Bean

Ở kiểu này, một phương thức trong bean sẽ thực hiện kiểm tra cho các UIComponent, sau đó được gọi từ trang JSF thông qua thuộc tính validator của thẻ inputText. Dưới đây là ví dụ kích hoạt xác thực từ 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>

Trong trang này, phương thức validateModelNo của java bean được gọi trong thuộc tính validator của thẻ.

Tạo Mobile.java như sau

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

		}

	}

}

Ở đây, độ dài của mã model được kiểm tra, nếu độ dài nhỏ hơn 4 thì thông báo “Minimum length of model number is 4” sẽ được thiết lập. Khi chạy ứng dụng, kết quả thu được như sau.

JSF xác thực với thẻ validator và custom validator

JSF Validation Example

Sử dụng @FacesValidator trong Bean: Custom JSF Validator

Trong phương pháp này, sử dụng annotation @FacesValidator, chỉ định tên cho validator và triển khai Validator bằng cách ghi đè phương thức 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>

Trong phần này, validator tùy chỉnh tên mobileValidator được gọi trong thuộc tính validatorId của thẻ <f:validator>.

Tạo MobileValidator.java như sau

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

	}

}

Tại đây, phương thức validate tiêu chuẩn được ghi đè và triển khai logic riêng để xác thực các trường đầu vào.

Chạy ứng dụng và xem kết quả như bên dưới.

JSF xác thực với thẻ validator và custom validator

JSF Validation Validator

Cuối cùng, hình bên dưới cho thấy cấu trúc dự án.

JSF xác thực với thẻ validator và custom validator

JSF Form Validation, Custom Validator

Bạn có thể tải dự án từ liên kết bên dưới và thử nghiệm để tìm hiểu rõ hơn.

Tải về dự án ví dụ JSF Validation

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất