[series Spring Boot] 12. Form Validation

quydtkt

Administrator
1/11/19
307
30
28
26
Trong bài này, chúng ta sẽ cùng tìm hiểu về form validate trong Spring Boot.

1. Form validation

- Form validation là việc thực hiện kiểm tra tính hợp lệ của của dữ liệu được người dùng đưa lên web server trước khi thực hiện các xử lý tiếp theo.​
- Trong trường hợp, dữ liệu người dùng nhập vào được lưu xuống database thì việc thực hiện form validation là cần thiết để đảm bảo dữ liệu được lưu tại database luôn là đúng đắn.​

2. Form validation trong Spring Boot

- Spring Boot hỗ trợ validate các field/property khi submit form bằng cách sử dụng các annotation validate của hibernate-validator, javax-validation.​
- Trong bài này, chúng ta sẽ cùng tìm hiểu về một số dạng form validation trong Spring Boot​
- Một số annotation thường gặp​

  • @NotNull/@NotBlank: Kiểm tra khác null/rỗng
  • @Email: Kiểm tra định dạng email
  • @Length: Kiểm tra độ đài chuỗi
  • @Valid/@Validate: Đánh dấu form cần validation
- Mặc định các message lỗi sẽ được lấy từ file .properties, nếu không tìm thấy thì nó sẽ lấy theo các message khai báo bên tại tham số message của annotation, nếu không tìm thấy cả 2 chỗ trên thì nó sẽ thấy message mặc định của hibernate-validator và validation-api​

RegisterController.java
Java:
package vn.congdongjava.controller;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import vn.congdongjava.form.RegisterForm;

import javax.validation.Valid;

@Controller
public class RegisterController {

    @RequestMapping(value = "register", method = RequestMethod.GET)
    public String show(@ModelAttribute("form") RegisterForm form) {
        return "register";
    }

    @RequestMapping(value = "register", method = RequestMethod.POST)
    public String submit(@ModelAttribute("form") @Valid RegisterForm form, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "register";
        }

        return "redirect:/register_success";
    }
}
- Tại RegisterController có 2 request mapper
  • show: Hiển thị màn hình đăng kí
    • Tại tham số đầu vào của request mapper, ta có truyền một một object. Đây là object chứa tất cả cả field input trên màn hình. Thay vì phải truyền đúng số lượng field thì ta gom các field đó thành một object lớn
    • Object form được đánh dấu bằng annotation @ModelAttribute dùng để render form tại html.
  • submit: Xử lý đăng kí dữ liệu
    • Object với kiểu RegisterForm là tham số đầu vào, dùng để nhận dữ liệu truyền lên từ client
    • Object với kiểu RegisterForm, được đánh dấu bằng annotation @ModelAttribute có công dụng như tại request mapper show. Ngoài ra còn annotation @Valid để Spring Boot tự động validate cho dữ liệu của object này.
    • Tham số đầu vào BindingResult dùng để chưa danh sách lỗi khi validate object RegisterForm.
    • Method hasErrors dùng đễ kiểm tra có lỗi validate nào trong object BindingResult hay không
    • Nếu có lỗi validate thì trả lên view để hiển thị lỗi. Ngược lại sẽ chuyển sang màn hình đăng kí thành công.

RegisterForm.java
Java:
package vn.congdongjava.form;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;

public class RegisterForm {

    @NotBlank(message = "Vui lòng nhập Tên đăng nhập")
    private String username;

    @NotBlank(message = "Vui lòng nhập Mật mã")
    private String password;

    @NotBlank(message = "Vui lòng nhập Xác nhận mật mã")
    private String passwordConfirm;

    @NotBlank(message = "Vui lòng nhập Email")
    @Email(message = "Email không đúng")
    private String email;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPasswordConfirm() {
        return passwordConfirm;
    }

    public void setPasswordConfirm(String passwordConfirm) {
        this.passwordConfirm = passwordConfirm;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
- Trong object RegisterForm có 4 filed, tương ứng với 4 input trên màn hình​
- Các field được đánh dấu bằng các annotation nằm trong package import javax.validation.constraints để Spring Boot validate dữ liệu một cách tự động​
- Giá trị tham số message trong các annotation chính là các lỗi sẽ hiển thị ra màn hình.​

register.html
HTML:
<!DOCTYPE html>
<html lang="en"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Register</title>
</head>
<body>
<form action="/register" method="post" th:object="${form}">
    Username: <input type="text" th:field="*{username}"><br/>
    <span th:if="${#fields.hasErrors('username')}" th:errors="*{username}"></span><br/>
    Password: <input type="password" th:field="*{password}"><br/>
    <span th:if="${#fields.hasErrors('password')}" th:errors="*{password}"></span><br/>
    Password confirm: <input type="password" th:field="*{passwordConfirm}"><br/>
    <span th:if="${#fields.hasErrors('passwordConfirm')}" th:errors="*{passwordConfirm}"></span><br/>
    Email: <input type="text" th:field="*{email}"><br/>
    <span th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></span><br/>
    <button type="submit">Đăng kí</button>
</form>
</body>
</html>
Chạy project và truy cập link http://localhost:8080/register


Click Đăng kí

- Các trường hợp còn lại, các bạn có thể tự thực hành​

ApplicationConfig.java
Java:
package vn.congdongjava.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;

import java.nio.charset.StandardCharsets;

@Configuration
public class ApplicationConfig {

    @Bean
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource;

        messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasenames("classpath:message/message");
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());

        return messageSource;
    }
}
message.properties
Code:
NotBlank=Not Blank
Email=Email is wrong format
Chạy lại lại project và click Đăng kí


- Các message nằm trong file message.properties (có độ ưu tiên cao hơn) đã được hiển thị.​

Cám ơn các bạn đã theo dõi. Hẹn gặp lại trong bài viết tiếp theo :)
 

Attachments

Sửa lần cuối:
  • Like
Reactions: Joe