CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Mục lục

Trang chủHướng dẫnJSF Validator trong Java:...
Java

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

4 phút đọc11/09/2025
CyStack Author
Chris Pham

Technical Writer

0 lượt xem
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>
		&lt;h:outputLabel for="color"&gt;Color:&lt;/h:outputLabel&gt;
		&lt;h:inputText id="color" required="true"&gt;&lt;/h:inputText&gt;
		&lt;br&gt;
		&lt;br&gt;

		&lt;h:outputLabel for="model"&gt;Model Number:&lt;/h:outputLabel&gt;
		&lt;h:inputText id="model"&gt;&lt;/h:inputText&gt;
		&lt;br&gt;
		&lt;br&gt;

		&lt;h:commandButton value="Submit"&gt;&lt;/h:commandButton&gt;
	&lt;/h:panelGrid&gt;
&lt;/h:form&gt;

</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() &lt; 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() &gt; 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

<!-- notionvc: b8037d55-e63a-4942-97e0-53da0fe076b3 -->

Về tác giả

Chris Pham
Chris PhamTechnical Writer

I have over 5 years of experience writing technical documentation for tech products, making them accessible and user-friendly. My focus is always on providing clear and precise information. @#@ Tôi đã có hơn 5 năm kinh nghiệm viết tài liệu kỹ thuật cho các sản phẩm công nghệ, giúp người dùng dễ dàng tiếp cận và sử dụng. Tôi luôn tập trung vào việc cung cấp thông tin chính xác và dễ hiểu.

Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn

Thảo luận (0)

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

Bài viết liên quan