Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

[series Spring Boot] 12. Form Validation

Discussion in 'Spring Framework' started by quydtkt, 27/11/19.

  1. quydtkt

    quydtkt Administrator

    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
    PHP:
    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 formBindingResult 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
    PHP:
    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
    [​IMG]
    Click Đăng kí
    [​IMG]
    - Các trường hợp còn lại, các bạn có thể tự thực hành​
    ApplicationConfig.java
    PHP:
    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
    PHP:
    NotBlank=Not Blank
    Email
    =Email is wrong format
    Chạy lại lại project và click Đăng kí
    [​IMG]
    - 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 :)
     

    Attached Files:

    Joe likes this.

Chia sẻ trang này

Loading...