数据校验


数据校验

数据校验分为三个层次,分别是前端校验,后端校验,数据库校验。

  • 如果前端校验没有通过,数据是不会向后端发送的,而是在前端通知 用户校验失败。
  • 如果后端校验没有通过,数据时不会向数据库中存储的,而是将校验结果返回到界面,提示用户校验失败。
  • 如果数据库校验失败,数据是不会保存到数据库中的,而是将校验结果返回到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>
校验结果测试

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧梦时节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值