教務系統開發資料校驗
阿新 • • 發佈:2021-01-11
資料校驗
- 資料校驗分為三個層次,分別是前端校驗,後端校驗,資料庫校驗。
- 如果前端校驗沒有通過,資料是不會向後端傳送的,而是在前端通知 使用者校驗失敗。
- 如果後端校驗沒有通過,資料時不會向資料庫中儲存的,而是將校驗結果返回到介面,提示使用者校驗失敗。
- 如果資料庫校驗失敗,資料是不會儲存到資料庫中的,而是將校驗結果返回到dao,dao將校驗結果返回給service,service將校驗結果返回給controller,controller將校驗結果返回給介面,介面提示使用者校驗失敗。
後端校驗過程
第一步:匯入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>