基于SpringBoot服务端表单数据校验的实现方式SpringBoot服务端表单数据校验(SpringBoot高级)一、实现添加用户功能1 创建项目2 修改POM文件<project xmlns="http://maven.apache.
SpringBoot服务端表单数据校验
(SpringBoot高级)
一、实现添加用户功能
1 创建项目
2 修改POM文件
<project xmlns=”http://maven.apache.org/POM/4.0.0″ xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.10.RELEASE</version> </parent> <groupId>com.bjsxt</groupId> <artifactId>13-spring-boot-validate</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>1.7</java.version> <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version> <thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version> </properties> <dependencies> <!– springBoot的启动器 –> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!– thymeleaf的启动器 –> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies></project>
3 编写添加用户功能
3.1 创建实体类
publicclass Users { private String name; private String password; private Integer age; public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } public String getPassword() { returnpassword; } publicvoid setPassword(String password) { this.password = password; } public Integer getAge() { returnage; } publicvoid setAge(Integer age) { this.age = age; } @Override public String toString() { return”Users [name=” + name + “, password=” + password + “, age=” + age + “]”; } }
3.2 编写Controller
/** * SpringBoot 表单数据校验 * * */@Controllerpublicclass UsersController { @RequestMapping(“/addUser”) public String showPage(){ return”add”; } /** * 完成用户添加 */ @RequestMapping(“/save”) public String saveUser(Users users){ System.out.println(users); return”ok”; }}
3.3 编写页面add.html ok.html
<!DOCTYPE html><html><head><meta charset=”UTF-8″><title>添加用户</title></head><body> <form th:action=”@{/save}” method=”post”> 用户姓名:<input type=”text” name=”name”/><br/> 用户密码:<input type=”password” name=”password” /><br/> 用户年龄:<input type=”text” name=”age” /><br/> <input type=”submit” value=”OK”/> </form></body></html><!DOCTYPE html><html><head><meta charset=”UTF-8″><title>操作成功</title></head><body> OK。。。。</body></html>二、SpringBoot对表单做数据校验
1 SpringBoot对表单数据校验的技术特点
1.1 SpringBoot中使用了Hibernate-validate校验框架
2 SpringBoot表单数据校验步骤
2.1 在实体类中添加校验规则
publicclass Users { @NotBlank//非空校验 private String name; @NotBlank//密码非空校验 private String password; private Integer age; public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } public String getPassword() { returnpassword; } publicvoid setPassword(String password) { this.password = password; } public Integer getAge() { returnage; } publicvoid setAge(Integer age) { this.age = age; } @Override public String toString() { return”Users [name=” + name + “, password=” + password + “, age=” + age + “]”; } }
2.2 在Controller中开启校验
/** * 完成用户添加 *@Valid开启对Users对象的数据校验 *BindingResult:封装了校验的结果 */ @RequestMapping(“/save”) public String saveUser(@Valid Users users,BindingResult result){ if(result.hasErrors()){ return”add”; } System.out.println(users); return”ok”; }
2.3 在页面中获取提示信息
<!DOCTYPE html><html><head><meta charset=”UTF-8″><title>添加用户</title></head><body> <form th:action=”@{/save}” method=”post”> 用户姓名:<input type=”text” name=”name”/><font color=”red” th:errors=”${users.name}”></font><br/> 用户密码:<input type=”password” name=”password” /><font color=”red” th:errors=”${users.password}”></font><br/> 用户年龄:<input type=”text” name=”age” /><font color=”red” th:errors=”${users.age}”></font><br/> <input type=”submit” value=”OK”/> </form></body></html>
2.4 遇到异常
在jsp当中,如果一个对象根本不存在,那么他仍然可以在jsp页面进行遍历,只不过为空,不显示而已,但是在thymeleaf当中,如果说这个对象不存在,他就会报以下错误,解决问题的办法就是在controller中的方法上的传递参数加上这个对象,以便在thymeleaf视图层当中,告知这个对象是存在于的
三、解决数据校验时的异常问题
解决异常的方法,在跳转页面的方法中注入一个对象,来解决问题。要求参数对象的变量名必须是对象的类名的全称首字母小写。
在springboot 1.5当中,参数变量必须是对象类的名称首字母小写,但是在springboot2.0以上,已经很大程度上优化了这个问题,变量名称随便写,因为在跳转页面的时候,将该对象放入到Model当中传递,他的key 就是对象的类的全程首字母大写(默认),在thymeleaf当中取出这个值的时候,他的key为对象的类的全程首字母大写,与参数的变量名无任何关系 如果非要更改Model当中的key值,一下有详解
代码
/** * 解决异常的方式。可以在跳转页面的方法中注入一个Uesrs对象。 * 注意:由于springmvc会将该对象放入到Model中传递。key的名称会使用该对象的驼峰式的命名规则来作为key。 * 参数的变量名需要与对象的名称相同。将首字母小写。 * * @param users * @return */ @RequestMapping(“/addUser”) public String showPage( Users users){ return”add”; }/** * 完成用户添加 *@Valid开启对Users对象的数据校验 *BindingResult:封装了校验的结果 */ @RequestMapping(“/save”) public String saveUser( @Valid Users users,BindingResult result){ if(result.hasErrors()){ return”add”; } System.out.println(users); return”ok”; }
<!DOCTYPE html><html><head><meta charset=”UTF-8″><title>添加用户</title></head><body> <form th:action=”@{/save}” method=”post”> 用户姓名:<input type=”text” name=”name”/><font color=”red” th:errors=”${users.name}”></font><br/> 用户密码:<input type=”password” name=”password” /><font color=”red” th:errors=”${users.password}”></font><br/> 用户年龄:<input type=”text” name=”age” /><font color=”red” th:errors=”${users.age}”></font><br/> <input type=”submit” value=”OK”/> </form></body></html>
如果参数的名称需要做改变
/** * * 如果想为传递的对象更改名称,可以使用@ModelAttribute(“aa”)这表示当前传递的对象的key为aa。 * 那么我们在页面中获取该对象的key也需要修改为aa * @param users * @return */ @RequestMapping(“/addUser”) public String showPage(@ModelAttribute(“aa”) Users users){ return”add”; }/** * 完成用户添加 *@Valid开启对Users对象的数据校验 *BindingResult:封装了校验的结果 */ @RequestMapping(“/save”) public String saveUser(@ModelAttribute(“aa”) @Valid Users users,BindingResult result){ if(result.hasErrors()){ return”add”; } System.out.println(users); return”ok”; }
<!DOCTYPE html><html><head><meta charset=”UTF-8″><title>添加用户</title></head><body> <form th:action=”@{/save}” method=”post”> 用户姓名:<input type=”text” name=”name”/><font color=”red” th:errors=”${aa.name}”></font><br/> 用户密码:<input type=”password” name=”password” /><font color=”red” th:errors=”${aa.password}”></font><br/> 用户年龄:<input type=”text” name=”age” /><font color=”red” th:errors=”${aa.age}”></font><br/> <input type=”submit” value=”OK”/> </form></body></html>四、其他校验规则
@NotBlank: 判断字符串是否为null或者是空串(去掉首尾空格)。
@NotEmpty: 判断字符串是否null或者是空串。
@Length: 判断字符的长度(最大或者最小)
@Min: 判断数值最小值
@Max: 判断数值最大值
@Email: 判断邮箱是否合法
补充知识:控制Configuration是否生效,使用Springboot中@ConditionalOnProperty注解
介绍
@ConditionalOnProperty注解的作用是来控制Configuration是否生效
通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值。
matchIfMissing来控制默认值
如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。
如果返回值为false,则该configuration不生效;为true则生效。
使用
shardingjdbc中可以控制是否启用,这样可以针对某个配置来启动数据源,完全不影响代码实现,想完成这个功能就要用到Stringboot提供的注解@ConditionalOnProperty
因为默认是true,所以使用可以忽略,但是如果不需要使用,禁用则需要增加配置
spring.shardingsphere.enabled=false
以上这篇基于SpringBoot服务端表单数据校验的实现方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
SpringBoot 参数校验,高级特性,非常实用
之前也写过一篇关于 Spring Validation 使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂 Spring Validation 。 本文会详细介绍 Spring Validation 各种场景下的最佳实践及其实现原理,死磕到底! Java API 规范 ( JSR303 ) 定义了 Bean 校验的标准 validation-api ,但没有提供实现。
Spring Validation 是对 hibernate validation 的二次封装,用于支持 spring mvc 参数自动校验。接下来,我们以 spring-boot 项目为例,介绍 Spring Validation 的使用。 如果 spring-boot 版本小于 2.3.x , spring-boot-starter-web 会自动传入 hibernate-validator 依赖。如果 spring-boot 版本大于 2.3.x ,则需要手动引入依赖: 对于 web 服务来说,为防止非法参数对业务造成影响,在 Controller 层一定要做参数校验的!大部分情况下,请求参数分为如下两种形式: 下面我们简单介绍下 requestBody 和 requestParam/PathVariable 的参数校验实战! POST 、 PUT 请求一般会使用 requestBody 传递参数,这种情况下,后端使用** DTO 对象 进行接收。
只要给 DTO 对象加上 @Validated 注解就能实现自动参数校验**。比如,有一个保存 User 的接口,要求 userName 长度是 2-10 , account 和 password 字段长度是 6-20 。如果校验失败,会抛出 MethodArgumentNotValidException 异常, Spring 默认会将其转为 400(Bad Request) 请求。
DTO 表示数据传输对象(Data Transfer Object),用于服务器和客户端之间交互传输使用的 。在 spring-web 项目中可以表示用于接收请求参数的 Bean 对象。 这种情况下, 使用 @Valid 和 @Validated 都可以 。
前面说过,如果校验失败,会抛出 MethodArgumentNotValidException 或者 ConstraintViolationException 异常。在实际项目开发中,通常会用 统一异常处理 来返回一个更友好的提示。比如我们系统要求无论发送什么异常, http 的状态码必须返回 200 ,由业务码去区分系统的异常情况。
在实际项目中,可能多个方法需要使用同一个 DTO 类来接收参数,而不同方法的校验规则很可能是不一样的。这个时候,简单地在 DTO 类的字段上加约束注解无法解决这个问题。因此, spring-validation 支持了 分组校验 的功能,专门用来解决这类问题。还是上面的例子,比如保存 User 的时候, UserId 是可空的,但是更新 User 的时候, UserId 的值必须 >=10000000000000000L ;其它字段的校验规则在两种情况下一样。
这个时候使用 分组校验 的代码示例如下: 前面的示例中, DTO 类里面的字段都是 基本数据类型 和 String 类型。但是实际场景中,有可能某个字段也是一个对象,这种情况先,可以使用 嵌套校验 。 比如,上面保存 User 信息的时候同时还带有 Job 信息。需要注意的是, 此时 DTO 类的对应字段必须标记 @Valid 注解 。
嵌套校验可以结合分组校验一起使用。还有就是 嵌套集合校验 会对集合里面的每一项都进行校验,例如 List 字段会对这个 list 里面的每一个 Job 对象都进行校验。 如果请求体直接传递了 json 数组给后台,并希望对数组中的每一项都进行参数校验。此时,如果我们直接使用 java.util.Collection 下的 list 或者 set 来接收数据,参数校验并不会生效!我们可以使用自定义 list 集合来接收参数: @Delegate 注解受 lombok 版本限制, 1.18.6 以上版本可支持。
如果校验不通过,会抛出 NotReadablePropertyException ,同样可以使用统一异常进行处理。 比如,我们需要一次性保存多个 User 对象, Controller 层的方法可以这么写: 业务需求总是比框架提供的这些简单校验要复杂的多,我们可以自定义校验来满足我们的需求。自定义 spring validation 非常简单,假设我们自定义 加密id (由数字或者 a-f 的字母组成, 32-256 长度)校验,主要分为两步: 这样我们就可以使用 @EncryptId 进行参数校验了! 上面的示例都是基于 注解 来实现自动校验的,在某些情况下,我们可能希望以 编程方式 调用验证。
这个时候可以注入 javax.validation.Validator 对象,然后再调用其 api 。 Spring Validation 默认会校验完所有字段,然后才抛出异常。可以通过一些简单的配置,开启 Fali Fast 模式,一旦校验失败就立即返回。
在 spring-mvc 中, RequestResponseBodyMethodProcessor 是用于解析 @RequestBody 标注的参数以及处理 @ResponseBody 标注方法的返回值的。显然,执行参数校验的逻辑肯定就在解析参数的方法 resolveArgument() 中: 可以看到, resolveArgument() 调用了 validateIfApplicable() 进行参数校验。 看到这里,大家应该能明白为什么这种场景下 @Validated 、 @Valid 两个注解可以混用。我们接下来继续看 WebDataBinder.validate() 实现。
最终发现底层最终还是调用了 Hibernate Validator 进行真正的校验处理。 接着看一下 MethodValidationInterceptor : 实际上,不管是 requestBody参数校验 还是 方法级别的校验 ,最终都是调用 Hibernate Validator 执行校验, Spring Validation 只是做了一层封装 。 本人花费2个月时间,整理了一套JAVA开发技术资料,内容涵盖java基础,分布式、微服务等主流技术资料,包含大厂面经,学习笔记、源码讲义、项目实战、讲解视频。
Spring Boot实现用户注册验证全过程
在这篇文章中,我们将使用Spring Boot实现一个基本的邮箱注册账户以及验证的过程。 我们的目标是添加一个完整的注册过程,允许用户注册,验证,并持久化用户数据。
这个对象应该包含我们在注册和验证过程中所需要的基本信息。 例2.1 UserDto的定义 请注意我们在DTO对象的字段上使用了标准的javax.validation注解——@NotBlank。 @NotEmpty: 适用于CharSequence, Collection, Map 和 Array 对象,不能是null并且相关对象的size大于0。 @NotBlank: 该注解只能作用于String类型。
String非null且去除两端空白字符后的长度(trimmed length)大于0。 在下面的章节里,我们还将自定义注解来验证电子邮件地址的格式以及确认二次密码。 登录页面上的注册链接将用户带到注册页面: 例3.1 RegistrationController的定义 当RegistrationController收到请求/user/registration时,它创建了新的UserDto对象,将其绑定在Model上,并返回了注册页面registration.html。
接下来,让我们看看控制器在注册新账户时将执行的验证: 对于简单的检查,我们将使用@NotBlank来验证DTO对象。 为了触发验证过程,我们将在Controller中用@Valid注解来验证对象。 例4.1 registerUserAccount 下一步,让我们验证电子邮件地址,以保证它的格式是正确的。
我们将为此建立一个自定义验证器,以及一个自定义验证注解–IsEmailValid。 下面是电子邮件验证注解IsEmailValid和自定义验证器EmailValidator: 例4.2.1 IsEmailVaild注解的定义 例4.2.2 EmailValidator的定义 现在让我们在我们的UserDto实现上使用新注解。 我们还需要一个自定义注解和验证器,以确保UserDto中的password和repeatedPassword字段相匹配。
例4.3.1 IsPasswordMatching注解的定义 请注意,@Target注解表明这是一个Type级别的注解。这是因为我们需要整个UserDto对象来执行验证。 例4.3.2 PasswordMatchingValidator的定义 现在,将@IsPasswordMatching注解应用到我们的UserDto对象。 我们要实现的第四个检查是验证该电子邮件帐户在数据库中是否已经存在。
这是在表单被验证后进行的,我们把这项验证放在了UserService。 例4.4.1 UserService UserService依靠UserRepository类来检查数据库中是否已存在拥有相同邮箱的用户账户。当然在本文中我们不会涉及到UserRepository的实现。 然后我们继续实现RegistrationController中的持久化逻辑。
在上面的代码中我们可以发现:
1.我们创建了ModelAndView对象,该对象既可以保存数据也可以返回一个View。
2.在注册的过程中如果产生任何报错,将会返回到注册页面。 在本节内容中,我们将实现一个自定义的UserDetailsService,从持久层检查登录的凭证。 让我们从自定义UserDetailsService开始。
例6.1.1 MyUserDetailsService 然后,为了真正地能够开启自定义的MyUserDetailsService,我们还需要在SecurityConfig配置文件中加入以下代码: 限于篇幅,我们就不在这里详细展开SecurityConfig配置文件。至此我们完成了一个由Spring Boot实现的基本的用户注册过程。
SpringBoot+CXF 实现简单的webservice,并支持Basic验证
CXF内置了很多拦截器,大部分默认添加到拦截器链中,有些拦截器也可以手动添加,如CXF的日志拦截器。
spring boot 怎么实现reqository的方法
Controller方法加参数,参数名和表单中名字一样就可以啊 如:public String test(User user) { System.out.println(user.username); } 表单中就是 这样控制台就能打印出表单中输入的username了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表优客号立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://www.youkehao.org.cn/article/62181.html
如若内容造成侵权/违法违规/事实不符,请联系优客号进行投诉反馈,一经查实,立即删除!