zoukankan      html  css  js  c++  java
  • 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>

    效果截图:

  • 相关阅读:
    mysql show profiles 使用分析sql 性能
    面向对象三大特征---封装、继承、多态
    http_build_query用法,挺方便的
    请求数据
    多模匹配算法之Aho-Corasick
    php命名空间如何引入一个变量类名?
    MySQL错误:Can't connect to MySQL server (10060)
    Vim完全教程
    路由
    wireshark
  • 原文地址:https://www.cnblogs.com/Qi1007/p/9896041.html
Copyright © 2011-2022 走看看