SpringBoot 对表单数据有效性检验JSR303

         在SpringBoot 中使用服务器端的数据校验和单独使用SpringMVC 中的数据校验采用的都是 JSR303 这个规范的实现产品Hibernate-Validate。

一、JSR-303简介:JSR 303 - Bean Validation 介绍及最佳实践

JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。

此实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。

Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。

JSR-303 是一个数据验证的规范,但是 spring 并没有对其进行实现,Hibernate Validator 是实现了这一规范的,JSR-303可以使用注解的方式进行验证,它内部已经定义好了一系列的限制注解,我们只需要把这些注解标记在需要验证的实体类的属性上或是其对应的get方法上。

常用校验注解

二、SpringBoot 表单数据校验步骤

1、SpringBoot 已经将相关的jar包整合进来了,所以不用自己导包
2、在 JavaBean 的属性上加验证注解(可自定义错误提示信息)

import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import java.util.Date;
@Entity
@Table(name = "t_user")
public class User {
    private int id;
    @NotEmpty(message = "用户名不能为空")
    private String username;
    @NotEmpty
    private String password;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date regDate;

    private Address address;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getId() {
        return id;
    }

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

    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;
    }

    @Column(name = "reg_date")
    public Date getRegDate() {
        return regDate;
    }

    public void setRegDate(Date regDate) {
        this.regDate = regDate;
    }

    // 多(用户)对一(地址)
    @ManyToOne
    @JoinColumn(name = "address_id")
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", regDate=" + regDate +
                ", address=" + address +
                '}';
    }
}
import javax.persistence.*;

@Entity
@Table(name = "t_address")
public class Address {
    private int id;
    private String addressInfo;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getId() {
        return id;
    }

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

    @Column(name = "address_info")
    public String getAddressInfo() {
        return addressInfo;
    }

    public void setAddressInfo(String addressInfo) {
        this.addressInfo = addressInfo;
    }

    @Override
    public String toString() {
        return "Address{" +
                "id=" + id +
                ", addressInfo='" + addressInfo + '\'' +
                '}';
    }
}


3、在Controller的处理方法上的参数前,加@Valid注解,错误信息放置的对象参数 Errors/BindingResult errorrs。

@Controller
public class UserController {
    /**
     * @param user 做有效性校验,必须要有这个参数
     * @param model
     * @return
     */
    @GetMapping("/addUser")
    public String addUser(User user, Model model){
        List<Address> addressList = addressService.getAllAddress();
        model.addAttribute("addressList", addressList);
        return "addUser";
    }

    /**
     * @param user  valid注解:开启校验,
     * @param errors  Errors/BindingResult 必须紧跟在校验对象之后
     * @param model
     * @return
     */
    @PostMapping("/adduser")
    public String adduser(@Valid User user, BindingResult errors, Model model){

        if(errors.getErrorCount() > 0){
            // 错误信息,可以在thymeleaf模板引擎中用th:errors="${}"来回显。
            // 原本页面关联的信息也要回显
            List<Address> addressList = addressService.getAllAddress();
            model.addAttribute("addressList", addressList);
            return "addUser";
        }
        user.setRegDate(new Date());
        userService.add(user);
        return "redirect:userList";
    }

}


4、页面中用 th:errors="${}" 来显示不满足要求的数据的信息。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>添加用户</title>
</head>
<body>
<div class="main">
    <br><br>
    <form th:action="@{/adduser}" method="post">
        用户名:<input type="text" name="username" th:value="${user.username}"/><span style="color: red" th:errors="${user.username}"></span><br><br>
        用户密码:<input type="text" name="password"/><span style="color: red" th:errors="${user.password}"></span><br><br>
        选中用户地址:
        <select name="address.id">
            <option th:value="${address.id}" th:each="address:${addressList}">[[${address.addressInfo}]]</option>
        </select><br><br>
        <input type="submit" th:value="添加"/>
    </form>
</div>
</body>
</html>

 

   

三、可以使用 @ModelAttribute() 来修改当前传递的对象的key

       由于 springmvc 会将该对象放入到model中传递,key 的名称会使用该对象的驼峰命名规则来作为key,参数的变量名需要与对象的名称相同,将首字母小写。

       如果想改个名称,用注解 @ModelAttribute() 来标明。

@Controller
public class UserController {
        /**
     * @param user 做有效性校验,必须要有这个参数
     * @param model
     * @return
     */
    @GetMapping("/addUser")
    public String addUser(@ModelAttribute(value = "uu") User user, Model model){
        List<Address> addressList = addressService.getAllAddress();
        model.addAttribute("addressList", addressList);
        return "addUser";
    }

    /**
     * @param user  valid注解:开启校验,
     * @param errors  Errors/BindingResult 必须紧跟在校验对象之后
     * @param model
     * @return
     */
    @PostMapping("/adduser")
    public String adduser(@Valid @ModelAttribute(value = "uu")  User user, BindingResult errors, Model model){

        if(errors.getErrorCount() > 0){
            // 错误信息,可以在thymeleaf模板引擎中用th:errors="${}"来回显。
            // 原本页面关联的信息也要回显
            List<Address> addressList = addressService.getAllAddress();
            model.addAttribute("addressList", addressList);
            return "addUser";
        }
        user.setRegDate(new Date());
        userService.add(user);
        return "redirect:userList";
    }
}
<form th:action="@{/adduser}" method="post">
        用户名:<input type="text" name="username" th:value="${uu.username}"/><span style="color: red" th:errors="${uu.username}"></span><br><br>
        用户密码:<input type="text" name="password"/><span style="color: red" th:errors="${uu.password}"></span><br><br>
        选中用户地址:
        <select name="address.id">
            <option th:value="${address.id}" th:each="address:${addressList}">[[${address.addressInfo}]]</option>
        </select><br><br>
        <input type="submit" th:value="添加"/>
    </form>

 

ends ~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值