前言
本章讲解SpringBoot进阶篇的第一节,也就是服务端的表单校验
方法
1.概念
我们在校验表单的时候啊,一般有以下两种校验方式,前者通过我们的js代码,后者通过Java来进行实现。那么两者的优缺点如下:
客户端确认:
减少服务器负载、缩短用户等待时间、兼容性难
服务器端确认:
统一确认、兼容性强、服务器负载重
2.实现添加用户功能的表单
在这里呢,细节我们不需探讨,我们依然采用原来的Users类,以及MyBatis的实现方式。
UserMapper:
package cn.edu.ccut.mapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;
import cn.edu.ccut.bo.Users;
@Component
public interface UserMapper {
@Select({"select * from users where username=#{username} and password=#{password}"})
public Users doLogin(@Param("username") String username, @Param("password") String password);
@Insert("insert into users (username,password) values (#{username},#{password})")
public void doCreate(Users user);
}
addUser.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户添加页面</title>
</head>
<body>
<form action="/save" method="post">
用户名:<input name="username" type="text"/><br/>
密码:<input name="password" type="text"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
3.SpringBoot表单的校验
虽然名义上是SpringBoot的服务器端表单校验,但实际上使用的是hibernate的validate校验框架来实现的。
springBoot的web启动器帮我们集成了这一jar包,所以我们无需添加新的坐标。
1)首先需要在需要校验的实体类中属性加入适当的注解来代表校验规则
比如@NotBlank,表示非空校验,我们先拿这个注解做测试
2)在controller中添加注解开启校验,注入校验结果类
@Valid表示开启对Users对象的校验
BindingResult表示校验结果类,其中包含校验成功与否的相关信息
3)更改页面如下:
其中,th:errors表示取出校验失败的对象的信息,变量名称与校验对象一致。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户添加页面</title>
</head>
<body>
<form action="/save" method="post">
用户名:<input name="username" type="text"/><font color="red" th:errors="${user.username}"></font><br/>
密码:<input name="password" type="text"/><font color="red" th:errors="${user.password}"></font><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
然后我们启动项目,访问http://localhost:8080/addUser,发现报错了:
发生这个问题的原因是在我们进行跳转的过程中,并没有user对象传递过来!!!
我们需要在跳转方法中注入一个Users对象,并将其命名为我们需要的名字:
这里将使用@ModelAttribute注解来修改我们的名字,确保它和我们页面的对象对的上!
注意:如果这里将名字更改为user的话,提交的方法也需要加上这个参数以确保一致。
4)访问http://localhost:8080/addUser,并进行校验
此刻,我们看到的是其默认的信息提示,即不能为空。那么我们也是可以通过代码更改其提示内容的!
那么再次访问的结果将是下面的内容:
4.其他校验规则
@AssertTrue | 用于boolean字段,该字段只能为true |
@AssertFalse | 该字段的值只能为false |
@CreditCardNumber | 对信用卡号进行一个大致的验证 |
@DecimalMax | 只能小于或等于该值 |
@DecimalMin | 只能大于或等于该值 |
@Digits(integer=,fraction=) | 检查是否是一种数字的整数、分数,小数位数的数字 |
检查是否是一个有效的email地址 | |
@Future | 检查该字段的日期是否是属于将来的日期 |
@Length(min=,max=) | 检查所属的字段的长度是否在min和max之间,只能用于字符串 |
@Max | 该字段的值只能小于或等于该值 |
@Min | 该字段的值只能大于或等于该值 |
@NotNull | 不能为null |
@NotBlank | 不能为空,检查时会将空格忽略 |
@NotEmpty | 不能为空,这里的空是指空字符串 |
@Null | 检查该字段为空 |
@Past | 检查该字段的日期是在过去 |
@Pattern(regex=,flag=) | 被注释的元素必须符合指定的正则表达式 |
@Range(min=,max=,message=) | 被注释的元素必须在合适的范围内 |
@Size(min=, max=) | 检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等 |
@URL(protocol=,host,port) | 检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件 |
@Valid | 该注解主要用于字段为一个包含其他对象的集合或map或数组的字段,或该字段直接为一个其他对象的引用,这样在检查当前对象的同时也会检查该字段所引用的对象 |