SpringMVC之表單校驗


  SpringMVC已經實現了對Java校驗API(JSR-303)的支持,通過使用該API可以實現對數據的校驗。要使用SpringMVC的Java校驗API並不需要任何配置,只要引入其實現即可。本文使用hibernate-validator 5.2.4。

  首先使用Maven使用hibernate-validator 5.2.4。接着就可以直接使用了。本文使用場景為注冊,注冊時需要提供用戶名、密碼以及出生日期,用戶名以及密碼的長度為5到20,出生日期必須為過去時間。

  首先使用Java校驗API提供的注解來注解需要校驗的bean,具體的注解在本文最后列出注冊前的數據校驗

package cn.powerfully.demo.domain;

import java.util.Date;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;

public class User {
    @NotNull
    @Size(min = 5, max = 20)
    private String username;
    @NotNull
    @Size(min = 5, max = 20)
    private String password;
    @NotNull
    @Past
    private Date birth;

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

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

}

  對於Controller中方法,使用bean來傳遞參數,使用@Validated注解該參數表示該bean需要進行校驗,並且該方法中必須要有類型為Errors的參數(當然實現了Errors旗下的都可以,例如BindingResult)。

@RequestMapping(path = "register", method = RequestMethod.POST)
public String doRegister(Model model, @Validated User user, Errors errors) {
    if (errors.hasErrors()) {
        model.addAttribute("errors", errors);
        return "register";
    }
    // ...
    model.addAttribute(user);
    return "msg";
}

  如果校驗存在錯誤,則將錯誤信息存放在request中並轉發到注冊表單。對於jsp頁面,從request域中獲取錯誤信息。  

<%@ page language="java" contentType="text/html; charset=UTF-8"
    isELIgnored="false" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>注冊</h1>
    <br>
    <form method="post"
        action="${pageContext.request.contextPath }/user/register">
        <input type="text" name="username" placeholder="用戶名"> ${errors.getFieldError("username").defaultMessage }<br>
        <input type="password" name="password" placeholder="密碼"> ${errors.getFieldError("password").defaultMessage }<br>
        <input type="date" name="birth" placeholder="出生日期"> ${errors.getFieldError("birth").defaultMessage }<br> <input
            type="submit" value="注冊">
    </form>
</body>
</html>

  JAVA EE6以上版本中EL表達式可以直接調用方法,不可以直接使用errors.fieldError["username"].defaultMessage,因為fieldError在其實現類里面並不是一個數組或集合。效果如下:

  關於錯誤信息的顯示,還有更方便的方法,那就是使用Spring提供的Jsp標簽,關於Spring的JSP標簽,這里就不寫了。

  如果先自定義錯誤信息,可以編寫ValidationMessages.properties文件並置於類目錄,在properties文件里下:

username.size=用戶名長度必須為{min}到{max}
password.size=密碼長度必須為{min}到{max}
birth.notNull=日期不能為空
birth.past=日期必須是過去的

  在bean注解時,使用message屬性來指定錯誤信息:

@NotNull
@Size(min = 5, max = 20, message = "{username.size}")
private String username;
@NotNull
@Size(min = 5, max = 20, message = "{password.size}")
private String password;
@NotNull(message = "{birth.notNull}")
@Past(message = "{birth.past}")
private Date birth;

  如果想使用國際化,需要創建ValidationErrors_xx.properties。


以下是Java校驗API提供的校驗注解

注解 描述
@AssertFalse  注解在Boolean類型上,並且值為false
@AssertTrue  注解在Boolean類型上,並且值為true 
@DecimalMax  所注解的元素必須是數字, 並且它的值要小於或等於給定的BigDecimalString值
@DecimalMin  所注解的元素必須是數字, 並且它的值要大於或等於給定的BigDecimalString值
@Digits  所注解的元素必須是數字, 並且它的值必須有指定的位數
@Future  所注解的元素的值必須是一個將來的日期
@Max  所注解的元素必須是數字, 並且它的值要小於或等於給定的值
@Min  所注解的元素必須是數字, 並且它的值要大於或等於給定的值
@NotNull  所注解元素的值必須不能為null
@Null  所注解元素的值必須為null
@Past  所注解的元素的值必須是一個已過去的日期
@Pattern  所注解的元素的值必須匹配給定的正則表達式
@Size  所注解的元素的值必須是String、 集合或數組, 並且它的長度要符合給定的范圍


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM