此处介绍根据第一篇配置:https://blog.csdn.net/qq_18620233/article/details/104662420
一. 前期介绍
1.1. 表单验证,采用AJAX提交
SpringBoot提供了强大的表单验证功能实现,给我们省去了写验证的麻烦;
这里我们给下实例,提交一个有姓名和年龄的表单添加功能,
要求姓名不能为空,年龄必须是不小于18 ;
1.2. 事务处理
在许多大型、关键的应用程序中,计算机每秒钟都在执行大量的任务。更为经常的不是这些任务本身,而是将这些任务结合在一起完成一个业务要求,称为事务。如果能成功地执行一个任务,而在第二个或第三个相关的任务中出现错误,将会发生什么?这个错误很可能使系统处于不一致状态。这时事务变得非常重要,它能使系统摆脱这种不一致的状态。
二. 表单验证代码实现
2.1 项目预览
三. 事务处理代码实现
3.1. 项目预览
3.2. 事务处理开始
假如在转账的时候出现了异常错误,这时我们就是发现A账号减去了100,而B账号并没有加100,这时就需要事务处理,返回到上一个状态。
3.3. 事务错误如下图
3.4. 事务处理添加
四. 代码实现
4.1. Student实体
package top.hiai.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotEmpty;
/**
* @Author www.hiai.top
* @Email goodsking@163.com
* @Message 更多资源尽在www.hiai.top
* @Introduction 类的介绍
*/
@Entity
@Table(name="t_student")
public class Student{
@Id
@GeneratedValue //主键
private Integer id;
@NotEmpty(message="姓名不能为空") //不能为空
@Column(length=50) //长度设置
private String username;
@NotEmpty(message="性别不能为空") //不能为空
private String sex;
@NotNull(message="年龄不能为空") //验证
@Min(value=18,message="年龄必须大于18岁")
private Integer age;
private float money; //用户账号金钱
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
}
4.2. Controller写下
表单验证控制器
/**
* 显示AJAX添加学生的视图
* @return
*/
@RequestMapping("/addview2")
public ModelAndView studentAddViewAjax(){
ModelAndView mav = new ModelAndView();
mav.addObject("title", "Ajax添加学生");
mav.setViewName("studentAdd2");
return mav;
}
/**
* 添加学生信息,会验证输入
* @param student 学生实体
* @param bindingResult 返回错误的信息
* @return
* @Valid开启验证信息
*/
@ResponseBody
@RequestMapping("/adds")
public String studentAdds(@Valid Student student,BindingResult bindingResult){
//判断是否有返回信息
if(bindingResult.hasErrors()){
//返回错误信息
return bindingResult.getFieldError().getDefaultMessage();
}else{
studentService.studentAdd(student);
return "添加成功";
}
}
事务处理控制器
/**
* 显示事务处理的视图
* 事务就是出现错误返回上一个状态
* @return
*/
@RequestMapping("/trans")
public ModelAndView trans(){
ModelAndView mav = new ModelAndView();
mav.addObject("title", "转账事务处理");
mav.setViewName("studentTrans");
return mav;
}
/**
* 事务处理,A账号减去金钱,B账号添加金钱
* @param formUser A账号ID
* @param toUser B账号ID
* @param money 转账金额
* @return
*/
@RequestMapping("/addTrans")
public String addTrans(@RequestParam(value = "formUser",required = true) int formUser,
@RequestParam(value = "toUser",required = true) int toUser,
@RequestParam(value = "money",required = true) float money){
try{
studentService.transFeAccount(formUser, toUser, money);
return "redirect:/student/list2"; //重定向
}catch(Exception e){
System.out.println("失败了");
return "redirect:/student/list2"; //重定向
}
}
4.3. service接口写下
表单验证Service
/**
* 添加学生信息
* @param student
* @return
* 没有ID主键就是添加
* 有ID主键就是修改
*/
public void studentAdd(Student student){
studentRepository.save(student);
}
事务处理Service
/**
* 事务处理添加
* @param formUser A账号
* @param toUser B账号
* @param money 金钱
*/
public void transFeAccount(int formUser,int toUser,float money){
//减去A账号的金额
Student formAccount = studentRepository.getOne(formUser);
formAccount.setMoney((formAccount.getMoney() - money));
//保存操作
studentRepository.save(formAccount);
//B账号加上相应的金额
Student toAccount = studentRepository.getOne(toUser);
toAccount.setMoney((toAccount.getMoney() + money));
//出现异常错误,如果需要正常就删除下面异常的代码
int test = 1/0;
System.out.println(test);
//保存操作
studentRepository.save(toAccount);
}
4.4. 前台页面写下
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<title th:text="${title}+'-AJAX提交'"></title>
<script type="text/javascript" th:src="@{/jquery.js}"></script>
</head>
<body>
<div>
学生姓名:<input type="text" id="username" name="username"/><br/>
学生性别:<input type="text" id="sex" name="sex"/><br/>
学生年龄:<input type="text" id="age" name="age"/><br/>
学生账号:<input type="text" id="money" name="money" required="required"/><br/>
<input type="button" onclick="submitData()" value="提交"/>
</div>
<script th:inline="javascript">
/*<![CDATA[*/
function submitData(){
$.post("/student/adds",{username:$("#username").val(),sex:$("#sex").val(),age:$("#age").val(),money:$("#money").val()},
function(result){
alert(result);
}
);
}
/*]]>*/
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<title th:text="${title}+'-拾光博客'"></title>
</head>
<body>
<form action="/student/addTrans" method="post">
学生A账户ID:<input type="text" name="formUser"/><br/>
学生B账户ID:<input type="text" name="toUser"/><br/>
转账金额: <input type="text" name="money"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
五. 其他验证补充
这里只用了两个注解,下面列下清单,平时可以参考用;
限制 说明
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式