数据校验
数据校验分为三个层次,分别是前端校验,后端校验,数据库校验。
- 如果前端校验没有通过,数据是不会向后端发送的,而是在前端通知 用户校验失败。
- 如果后端校验没有通过,数据时不会向数据库中存储的,而是将校验结果返回到界面,提示用户校验失败。
- 如果数据库校验失败,数据是不会保存到数据库中的,而是将校验结果返回到dao,dao将校验结果返回给service,service将校验结果返回给controller,controller将校验结果返回给界面,界面提示用户校验失败。
校验的单个层次如下图所示:
本次学习的是后端校验,就是上图中红色部分,SSM后端校验使用的时JSR303。
JSR是Java Specification Requests的缩写,意思是Java 规范提案。
校验过程
第一步:导入jsr303的jar包
Jar包在pom中通过依赖导入,Hibernate实现了jsr303的校验,因此使用的是hibernate-validator。
<!--JSR303数据校验支持 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.0.Final</version>
</dependency>
第二步:在实体对象中添加校验规则
界面提交的数据会提交给控制器的方法参数,控制器方法参数通常是实体类型,因此我们需要在实体类上添加验证规则,验证规则是使用注解实现的,常用的注解有
@NotNull(message=“用户名不允许为空”):验证属性是否为null
@Length(max=4,min=2,message=“姓名必须填写”):验证属性长度是否合法
例如:验证学生姓名必须填写,验证规则如下:
@NotNull(message="用户名不允许为空")
@Length(max=4,min=2,message="姓名必须填写")
private String stuName;
第三步:在控制器中进行校验
在控制器中使用注解开始校验,用于发起校验的注解是@Validated,该注解必须用在控制器方法的参数中,并且紧跟着被校验的参数。
例如:
public String insert(@Validated ScoreModel scoreModel)
@Validated验证后,会将所有的验证未通过的结果保存到一个名称为BindingResult的对象中,BindingResult对象必须写在被验证参数的后面,且紧跟着被验证的参数。
例如:
public String insert(@Validated ScoreModel scoreModel, BindingResult br)
如何通过br知道验证的结果?br中使用了集合存储所有的验证结果,代码如下:
//用于添加成绩的方法
@RequestMapping("/insert")
public String insert(@Validated ScoreModel scoreModel, BindingResult br,Model model) {
if(br.hasErrors()) {
List<FieldError> errors = br.getFieldErrors();
for (int i = 0; i < errors.size(); i++) {
String field = errors.get(i).getField();
String message = errors.get(i).getDefaultMessage();
model.addAttribute(field, message);
}
model.addAttribute("scoreModel", scoreModel);
return "score/insert";
}
System.out.println(scoreModel.getStuName());
scoreService.insert(scoreModel);
return "redirect:/score/preparedInsert";//成绩添加完成后,跳转到添加成绩界面
}
第四步:在界面上显示校验结果
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加成绩</title>
</head>
<body>
<a href="${pageContext.request.contextPath }/score/selectAll">成绩列表</a>
添加学生成绩<br >
<form action="${pageContext.request.contextPath }/score/insert" method="post">
学生姓名<input type="text" name="stuName" value="${scoreModel.stuName }"/>${stuName }<br />
学生性别<input type="radio" name="gender" value="男" <c:if test="${scoreModel.gender=='男' }">checked="checked"</c:if>>男
<input type="radio" name="gender" value="女" <c:if test="${scoreModel.gender=='女' }">checked="checked"</c:if>>女<br>
课程名称<input type="text" name="courseName" value="${scoreModel.courseName }"><br >
课程成绩<input type="number" name="courseScore" value="${scoreModel.courseScore }"><br>
<input type="submit" value="保存成绩">
</form>
</body>
</html>