Springboot验证表单数据和自定义验证
验证表单
实验结果
项目结构目录如下
0.添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
0.设置路径
application.properties文件
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.encoding=utf-8
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.cache=false
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/static/
1.创建实体
User.java
package com.example.demo.entity;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
//import hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
import java.io.Serializable;
@Data
public class User implements Serializable {/*** 主键:id* */private Long id;@NotBlank(message = "用户名不能为空")@Length(min=5,max=20,message = "用户名长度为5-20个字符")private String name;@NotNull(message = "年龄不能为空")@Min(value=18,message = "最小18岁")@Max(value=60,message = "最大60岁")private Integer age;@Email(message = "请输入邮箱")@NotBlank(message = "邮箱不能为空")private String email;}
2.编写验证控制器
用于绑定数据验证
TestValidator.java
package com.example.demo.controller;
import com.example.demo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.validation.Valid;
@Controller
public class TestValidator {@GetMapping("/test")public String showForm(User user){return "form";}@GetMapping("/results")public String results(){return "results";}@PostMapping("/test")public String checkUser(@Valid User user,BindingResult bindingResult,RedirectAttributes attr){if(bindingResult.hasErrors()){return "form";}attr.addFlashAttribute("user",user);return "redirect:/results";}
}
3.编写视图
form.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<body>
<style type="text/css">.warn{color:red}
</style>
<form th:action="@{/test}" th:object="${user}" method="post"><div><div><span>姓名:</span><span><input type="text" th:field="*{name}"/></span><span class="warn" th:if="${#fields.hasErrors('name')}" th:errors="*{name}">名字错误</span></div><div><span>年龄:</span><span><input type="number" th:field="*{age}"/></span><span class="warn" th:if="${#fields.hasErrors('age')}" th:errors="*{age}">年龄错误</span></div><div><span>邮箱:</span><span><input TYPE="text" th:field="*{email}"/></span><span class="warn" th:if="${#fields.hasErrors('email')}" th:errors="*{email}">邮箱错误</span></div><div><span><button type="submit">提交</button></span></div></div>
</form>
</body>
</html>
results.html
如果验证成功,使用本视图进行渲染数据;如果验证失败,返回表单提示错误
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<body>
<div th:each="user:${user}">恭喜您,<span th:text="${user.name}">名字</span>(先生/女士),数据提交成功!<div>您的年龄是:<span th:text="${user.age}"></span></div><div>您的邮箱是:<span th:text="${user.email}"></span></div>
</div></body>
</html>
4.运行项目
打开http://localhost:8080/test
自定义验证
实验结果
项目结构
application.properties文件
spring.thymeleaf.mode=HTML
spring.thymeleaf.cache=false
1.自定义注解类
MyConstraintValdator.java
package com.example;import com.example.demo.MyConstraint;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class MyConstraintValdator implements ConstraintValidator<MyConstraint, String> {//String为校验的类型@Overridepublic void initialize(MyConstraint myConstraint) {//启动时执行}/*** @ Description: 自定义校验逻辑*/@Overridepublic boolean isValid(String s, ConstraintValidatorContext validatorContext) {if (!(s.equals("北京") || s.equals("上海"))) {return false;}return true;}
}
2.自定义验证业务逻辑类
有两个方法:initialize和isValid
MyConstraint .java
package com.example.demo;
import com.example.MyConstraintValdator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//限定使用范围:只能在字段上使用
@Target({ElementType.FIELD})
//表明注解的生命周期,它在代码运行时可以通过反射获取到注解
@Retention(RetentionPolicy.RUNTIME)
//@Constraint 注解,里面传入一个validateBy字段,以指定该注解的校验逻辑
@Constraint(validatedBy= MyConstraintValdator.class)public @interface MyConstraint {/*** @ Description:错误提示* */String message() default "请输入中国政治中心或经济中心的城市名";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
3.创建实体
User.java
package com.example.demo.entity;import com.example.demo.MyConstraint;
import lombok.Data;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.*;
import java.io.Serializable;@Data
public class User implements Serializable {/*** 主键ID*/private Long id;@NotBlank(message = "用户名不能为空")@Length(min = 5, max = 20, message = "用户名长度为5-20个字符")private String name;@NotNull(message = "年龄不能为空")@Min(value = 18 ,message = "最小18岁")@Max(value = 60,message = "最大60岁")private Integer age;/* @NotBlank(message = "电话不可以为空")@Length(min = 1, max = 13, message = "电话长度需要在13个字符以内")private String phone;*/@Email(message = "请输入邮箱")@NotBlank(message = "邮箱不能为空")private String email;/* @NotNull(message = "必须指定用户状态")@Min(value = 0, message = "用户状态不合法")@Max(value = 1, message = "用户状态不合法")private Integer status;*/@MyConstraintprivate String answer;}
4.编写验证控制器
TestValidator.java
package com.example.demo.controller;import com.example.demo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;import javax.validation.Valid;@Controller
public class TestValidator {@GetMapping("/test")public String showForm(User user) {return "form";}@GetMapping("/results")public String results() {return "results";}@PostMapping("/test")public String checkUser(@Valid User user, BindingResult bindingResult, RedirectAttributes attr) {if (bindingResult.hasErrors()) {return "form";}/*** @ Description:* 1.使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面 ,如上代码即为?name=long&age=45* 2.使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,* 这里的redirect必须是方法映射路径。你会发现redirect后的值只会出现一次,刷新后不会出现了,对于重复提交可以使用此来完成。*/attr.addFlashAttribute("user", user);return "redirect:/results";}
}
5.视图文件
form.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<body>
<style type="text/css">.warn{color:red}
</style>
<form th:action="@{/test}" th:object="${user}" method="post"><div><div><span>姓名:</span><span><input type="text" th:field="*{name}"/></span><span class="warn" th:if="${#fields.hasErrors('name')}" th:errors="*{name}">名字错误</span></div><div><span>年龄:</span><span><input type="number" th:field="*{age}"/></span><span class="warn" th:if="${#fields.hasErrors('age')}" th:errors="*{age}">年龄错误</span></div><div><span>邮箱:</span><span><input TYPE="text" th:field="*{email}"/></span><span class="warn" th:if="${#fields.hasErrors('email')}" th:errors="*{email}">邮箱错误</span></div><div><span>验证答案:</span><span><input TYPE="text" th:field="*{answer}"/></span><span class="warn" th:if="${#fields.hasErrors('answer')}" th:errors="*{answer}">答案错误</span></div><div><span><button type="submit">提交</button></span></div></div>
</form>
</body>
</html>
results.html
和上面无异
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<body>
<div th:each="user: ${user}">恭喜您,<span th:text="${user.name}">名字</span>(先生/女士),数据提交成功!<div>您的年龄是:<span th:text="${user.age}"></span></div><div> 您的邮箱是:<span th:text="${user.email}"></span></div>
</div></body>
</html>
依赖如下
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
由于SpringBoot使用的是2.3,此时需要手动添加validation的依赖。
Springboot验证表单数据和自定义验证相关推荐
- element-ui表单验证(验证手机号是否正确,自定义验证规则)
效果图 1. html <el-form :model="userForm"status-icon:rules="rules"class="lo ...
- Layui form 表单验证lay-verify的使用 和自定义验证及常用正则表达式
layui 表单自带校验 lay-verify:表单验证的关键字 有以下值供选择: required (必填项) phone(手机号) email(邮箱) url(网址) number(数字) dat ...
- JavaScript验证表单数据,HTML自动验证表单数据是否为空,数字范围
典型数据验证: a.字段是否为空: b.输入内容是否合法(例如数字字段是否输入了文本,email格式是否正确等) 数据验证时可通过javaScript进行表单验证,也可提交表单,在服务器端验证.通常情 ...
- 关于表单的Validform自定义验证
博主准备将在自己在田间生产管理系统中的关于表单验证Validform代码示下: $(function(){var form = $("#form1").Validform({tip ...
- 数据验证html,JavaScript 表单数据验证
JavaScript 表单 HTML 表单验证可以通过 JavaScript 来完成. HTML 表单验证也可以通过浏览器来自动完成. 如果表单字段 (fname) 的值为空, required 属性 ...
- Element UI 表单在el-form-item中使用自定义验证规则
1:官网示例 <el-form :model="ruleForm" status-icon :rules="rules" ref="ruleFo ...
- 功能:登录和退出(表单重置和预验证、路由导航守卫、路由重定向)
3.登录/退出功能 3.1登录概述 3.1-1.登录业务流程 ①在登录页面输入用户名和密码 ②调用后台接口进行验证 ③通过验证之后,根据后台的响应状态跳转到项目主页 3.1-2.登录业务的相关技术点 ...
- 【转】ASP.NET验证控件详解(非空验证,比较验证,范围验证,正则表达式,自定义验证)...
[转]ASP.NET验证控件详解(非空验证,比较验证,范围验证,正则表达式,自定义验证) ASP.NET验证控件详解 现在ASP.NET,你不但可以轻松的实现对用户输入的验证,而且,还可以选择验证在服 ...
- Java中布尔值的定义_使用简单的布尔值作为自定义验证器
我正在Angular 4中尝试表单验证,我对实现自定义验证器有点困惑 . 这是我的表格组声明: this.signupForm = fb.group({ 'username': [null, Vali ...
最新文章
- 条件独立(conditional independence) 结合贝叶斯网络(Bayesian network) 概率有向图 (PRML8.2总结)...
- DetNAS ThunderNet
- ABP入门系列(17)——使用ABP集成的邮件系统发送邮件
- 如何用结构型信号量实现互斥和同步
- 高平二中2021高考成绩查询,录取信息
- Java中 intValue,parseInt,Valueof 这三个关键字的区别
- JAVA基础—适配器设计模式
- LabVIEW升级图像识别功能
- 详细安装 kali 教程
- Simulink转化为低版本文件
- java poi设置导出的excel带下拉
- Tableau 网站流量分析案例汇总
- Shell脚本模拟用户行为刷App积分,学习娱乐之用,再加图像数字识别验证码登录
- 多维分析,为什么企业开始大规模应用商业智能(BI)
- XTransfer外贸收款账户是如何收费的?
- c语言魔方还原程序案例,利用C语言玩转魔方阵实例教程
- Android团队的组建和管理
- 农村小伙艰难的复工之路
- 前端HTML5 颜色选择器 input[type = color]
- 反爬虫,看看互联网大厂是怎么玩的?