SpringBoot框架学习记录第三篇之表单验证和事务处理

此处介绍根据第一篇配置: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格式

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值