Spring MVC DataBinding/Validation (验证)

JSR-303

JSR-303 是 java 官方推出的一套 Validation 接口。

pom.xml

<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.3.6.Final</version>
</dependency>

不同的版本使用的方法也不一样。

Bean Validation 中内置的 constraint:

  • @Null 被注释的元素必须为 null
  • @NotNull 被注释的元素必须不为 null
  • @AssertTrue 被注释的元素必须为 true
  • @AssertFalse 被注释的元素必须为 false
  • @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
  • @Digits(integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
  • @Past 被注释的元素必须是一个过去的日期
  • @Future 被注释的元素必须是一个将来的日期
  • @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

引入 jar 包后,添加验证逻辑,只需要在实体类上加上注解:

package com.xiaobai.entity;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.*;

public class Book {


    private int id;

    @NotEmpty(message = "zhe pa shi jia de ba")
    private String name;

    @DecimalMax(value = "100",message = "你可能买了本假书吧")
    private float price;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }
}

最后,只要在 Controller 的相关字段上添加 @Valid 注解即可启用验证:

package com.xiaobai.controller;

import com.xiaobai.entity.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ThemeResolver;

import javax.imageio.ImageIO;
import javax.mail.Multipart;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

@Controller
@RequestMapping("/book")
public class BookController {

    @RequestMapping(method = RequestMethod.GET)
    public String home(Book book) {
        return "input";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String add(@Valid Book book, BindingResult result) {
        if (result.hasErrors())
            return "book_input";
        System.out.println("正常业务。。。。");
        return "book_home";
    }

}

网页代码:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <style>
        .error {
            color: red;
        }
    </style>
    <link href="<spring:theme code="main.style"/>"/>
</head>
<body  style="color: <spring:theme code="main.color" />; background: <spring:theme code="main.bgcolor" />;">

<div>
    <spring:message code="global.greeting" arguments="兄嘚" />
    <br>
    <a href="/book/cl/zh">中文</a>
    <a href="/book/cl/en">English.</a>
    <a href="/book/cl/jp">小日本</a>
    <br><br>
</div>

<div>
    <br>
    <a href="/book/ct/boy">boy</a>
    <a href="/book/ct/girl">girl</a>
    <a href="/book/ct/default">默认</a>
    <br><br>
</div>

<form:form action="/book" method="post" modelAttribute="book">
    <div>
        <form:input path="name" placeholder="name"/>
        <form:errors path="name"/>
    </div>
    <div>
        <form:input path="price" placeholder="price"/>
        <form:errors path="price"/>
    </div>
    <input type="submit">
</form:form>

</body>
</html>

效果截图:

 

posted @ 2018-11-02 14:24  xiaobai1007  阅读(245)  评论(0编辑  收藏  举报