SpringMVC07_數據校驗

SpringMVC07_數據校驗


基於Validator接口的驗證器

  • Account 實體類:
package com.blu.entity;
import lombok.Data;

@Data
public class Account {
    private String name;
    private String password;
}
  • AccountValidator
package com.blu.validator;

import com.blu.entity.Account;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

public class AccountValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        //判斷是否是Account類型,如果是則返回true,表示支持驗證。
        return Account.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        //若name爲null,則在errors中添加“姓名不能爲空”的錯誤信息,該信息會被驗證器返回給前端。
        ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能爲空");
        ValidationUtils.rejectIfEmpty(errors,"password",null,"密碼不能爲空");
    }
    
}
  • login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
	<head>
    	<title>Title</title>
	</head>
	<body>
    	<form:form modelAttribute="account" action="/validator/login" method="post">
        	姓名:<form:input path="name"/><form:errors path="name"/><br>
        	密碼:<form:input path="password"/><form:errors path="password"/><br>
        	<input type="submit" value="登錄">
    	</form:form>
    </body>
</html>
  • ValidatorHandler
package com.blu.controller;

import com.blu.entity.Account;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/validator")
public class ValidatorHandler {

    @GetMapping("/login")
    public String login(Model model){
        model.addAttribute("account",new Account());
        return "login";
    }

    @PostMapping("/login")
    public String login(@Validated Account account, BindingResult bindingResult){
        if (bindingResult.hasErrors()){
            return "login";
        }else {
            return "index";
        }
    }
}
在請求參數上加 @Validated 註解表示開啓驗證
BindingResult 會獲取校驗錯誤信息
  • 在配置文件中註冊驗證器並使其生效:
<!-- 基於Validator的配置 -->
<bean id="accountValidator" class="com.blu.validator.AccountValidator"></bean>
<mvc:annotation-driven validator="accountValidator"></mvc:annotation-driven>
  • 測試(輸入http://localhost:8080/validator/login訪問,因爲是Get請求,故無數據校驗)
    在這裏插入圖片描述

  • 不填寫數據直接點擊登錄,此時是Post請求,校驗器開始起效:
    在這裏插入圖片描述


基於Annotation JSR - 303 標準的驗證
  • 需要導入支持這種標準的依賴,這裏使用 Hibernate Validator
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>6.0.7.Final</version>
</dependency>
<dependency>
	<groupId>javax.validation</groupId>
	<artifactId>validation-api</artifactId>
	<version>2.0.1.Final</version>
</dependency>
<dependency>
	<groupId>org.jboss.logging</groupId>
	<artifactId>jboss-logging</artifactId>
	<version>3.3.2.Final</version>
</dependency>
  • 通過註解的方式直接在實體類中添加相關的驗證規則
package com.blu.entity;

import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

@Data
public class Person {
    @NotEmpty(message = "用戶名不能爲空")
    private String username;
    @Size(min = 6,max = 12, message = "密碼的長度必須爲6-12位")
    private String password;
    @Email(regexp = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$",message ="請輸入正確的郵箱格式")
    private String email;
    @Pattern(regexp = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$",message = "請輸入正確的電話")
    private String phone;
}
  • 在配置文件中開啓註解:
<mvc:annotation-driven></mvc:annotation-driven>
  • Handler
@GetMapping("/register")
public String register(Model model){
	model.addAttribute("person",new Person());
	return "registerpage";
}

@PostMapping("/register")
public String register(@Valid Person person, BindingResult bindingResult){
	if (bindingResult.hasErrors()){
		return "registerpage";
	}else {
		return "index";
	}
}
注意這裏使用的註解不是 @Validated 而是 @Valid

校驗規則詳解: 
@Null 被註解的元素必須爲null 
@NotNull 被註解的元素不能爲null 
@Min(value) 被註解的元素必須是⼀個數字,其值必須⼤於等於指定的最⼩值 
@Max(value) 被註解的元素必須是⼀個數字,其值必須⼩于于等於指定的最⼤值 
@Email 被註解的元素必須是電⼦郵箱地址 
@Pattern 被註解的元素必須符合對應的正則表達式 
@Length 被註解的元素的⼤⼩必須在指定的範圍內 
@NotEmpty 被註解的字符串的值必須⾮空 
Null 和 Empty 是不同的結果,String str = null,str 是 null,String str = "",str 不是 null,其值爲空。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章