表单验证,是最为常见的,今天演示的是利用hibernate-validtor进行校验,有的时候,虽然前端方面通过jQuery或者require.js校验框架进行校验,可以减轻服务器的压力和改善用户体验,但是比如第三方请求接口方面也需要校验,在Controller里面套着一大堆if-elseif-else等等,两层嵌套还好,三层或者三层以上就不好了,日子久了继续嵌套,就会导致后面变得难以维护。我有一个朋友在一家国企,据他所说,他遇到的最烂代码是if-else if里面套者十几层,而且一个类的代码居然上千行,正常合理情况,当达到上千行代码就要考虑抽象继承或者多态,再设计模式了。设计模式,我不懂,只是了解,这里就不提了,后续博文会讲到设计模式的。

这里说Validator的意义在于,通过注解减少if-else等重复判断代码,从而使Java代码行数减少,因为加载类中的代码是需要时间的。代码行数减少,意味着加载时间减少,从而提高代码效率。

演示示例如下:

一、导入maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<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><groupId>org.springframework</groupId><artifactId>gs-validating-form-input</artifactId><version>0.1.0</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.8.RELEASE</version></parent><properties><java.version>1.8</java.version></properties><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><dependencies><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.4.1.Final</version>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-el</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>

二、编写实体

packagehello;importjavax.validation.constraints.Min;importjavax.validation.constraints.NotNull;importjavax.validation.constraints.Size;public classPersonForm {@NotNull@Size(min=2, max=30)privateString name;@NotNull@Min(18)privateInteger age;publicString getName() {return this.name;}public voidsetName(String name) {this.name =name;}publicInteger getAge() {returnage;}public voidsetAge(Integer age) {this.age =age;}publicString toString() {return "Person(Name: " + this.name + ", Age: " + this.age + ")";}
}

三、编写Controller

packagehello;importjava.util.List;importjavax.validation.Valid;importorg.springframework.format.FormatterRegistry;importorg.springframework.http.converter.HttpMessageConverter;importorg.springframework.stereotype.Controller;importorg.springframework.validation.BindingResult;importorg.springframework.validation.MessageCodesResolver;importorg.springframework.validation.Validator;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.method.support.HandlerMethodArgumentResolver;importorg.springframework.web.method.support.HandlerMethodReturnValueHandler;importorg.springframework.web.servlet.HandlerExceptionResolver;importorg.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;importorg.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.PathMatchConfigurer;importorg.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;importorg.springframework.web.servlet.config.annotation.ViewControllerRegistry;importorg.springframework.web.servlet.config.annotation.ViewResolverRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Controllerpublic class WebController implementsWebMvcConfigurer {@Overridepublic voidaddViewControllers(ViewControllerRegistry registry) {registry.addViewController("/results").setViewName("results");}@GetMapping("/")publicString showForm(PersonForm personForm) {return "form";}@PostMapping("/")publicString checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) {if(bindingResult.hasErrors()) {return "form";}return "/results";}@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver>arg0) {//TODO Auto-generated method stub
}@Overridepublic voidaddCorsMappings(CorsRegistry arg0) {//TODO Auto-generated method stub
}@Overridepublic voidaddFormatters(FormatterRegistry arg0) {//TODO Auto-generated method stub
}@Overridepublic voidaddInterceptors(InterceptorRegistry arg0) {//TODO Auto-generated method stub
}@Overridepublic voidaddResourceHandlers(ResourceHandlerRegistry arg0) {//TODO Auto-generated method stub
}@Overridepublic void addReturnValueHandlers(List<HandlerMethodReturnValueHandler>arg0) {//TODO Auto-generated method stub
}@Overridepublic voidconfigureAsyncSupport(AsyncSupportConfigurer arg0) {//TODO Auto-generated method stub
}@Overridepublic voidconfigureContentNegotiation(ContentNegotiationConfigurer arg0) {//TODO Auto-generated method stub
}@Overridepublic voidconfigureDefaultServletHandling(DefaultServletHandlerConfigurer arg0) {//TODO Auto-generated method stub
}@Overridepublic void configureHandlerExceptionResolvers(List<HandlerExceptionResolver>arg0) {//TODO Auto-generated method stub
}@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>>arg0) {//TODO Auto-generated method stub
}@Overridepublic voidconfigurePathMatch(PathMatchConfigurer arg0) {//TODO Auto-generated method stub
}@Overridepublic voidconfigureViewResolvers(ViewResolverRegistry arg0) {//TODO Auto-generated method stub
}@Overridepublic void extendHandlerExceptionResolvers(List<HandlerExceptionResolver>arg0) {//TODO Auto-generated method stub
}@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>>arg0) {//TODO Auto-generated method stub
}@OverridepublicMessageCodesResolver getMessageCodesResolver() {//TODO Auto-generated method stubreturn null;}@OverridepublicValidator getValidator() {//TODO Auto-generated method stubreturn null;}
}

四、编写html代码

form.html

<htmlxmlns:th="http://www.thymeleaf.org"><body><formaction="#"th:action="@{/}"th:object="${personForm}"method="post"><table><tr><td>Name:</td><td><inputtype="text"th:field="*{name}" /></td><tdth:if="${#fields.hasErrors('name')}"th:errors="*{name}">Name Error</td></tr><tr><td>Age:</td><td><inputtype="text"th:field="*{age}" /></td><tdth:if="${#fields.hasErrors('age')}"th:errors="*{age}">Age Error</td></tr><tr><td><buttontype="submit">Submit</button></td></tr></table></form></body>
</html>

result.html

<htmlxmlns:th="http://www.thymeleaf.org"><body>Congratulations! You are old enough to sign up for this site.</body>
</html>

五、编写配置文件

application.properties

server.port=8080
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.check-template-location=true
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.mode=HTML5

六、编写启动类

packagehello;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic classApplication {public static void main(String[] args) throwsException {SpringApplication.run(Application.class, args);}}

最后运行main方法,在浏览器输入localhost:8080/

会出现对应的表单页面,输入不合法会出现提示,表示验证成功

转载于:https://www.cnblogs.com/youcong/p/9387896.html

SpringBoot实战(九)之Validator相关推荐

  1. SpringBoot 实战 (九) | 整合 Mybatis

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 如题,今天介绍 SpringBoot 与 Mybatis 的整合以及 Mybatis 的使用,本文通过注解的形式实 ...

  2. 视频教程-SpringBoot实战视频教程-Java

    SpringBoot实战视频教程 书籍<分布式中间件技术实战 Java版>的作者,拥有6年Java后端开发经验和2年项目管理经验,熟悉Java领域流行技术,拥有多个微服务.分布式项目实战. ...

  3. Redis由浅到深层次讲解和springboot实战(服务器层面的搭建部署)

    Redis由深层次讲解到springboot实战 一.Nosql概述 为什么使用Nosql 1.单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用.随着用户增多,网站出现以 ...

  4. SpringBoot实战历程第一阶段-钟林森-专题视频课程

    SpringBoot实战历程第一阶段-209人已学习 课程介绍         本课程以实际业务场景为出发点.实战撸码为主.理论概念为辅,零基础一步一个脚印讲解当前微服务项目或分布式系统下Spring ...

  5. 都在强力进阶学习 springboot 实战派文档

    不仅如此,本文还对比讲解了多种同类技术的使用和区别,读者可以根据自己的喜好进行选择. 开发模式:本文讲解了历史悠久,但现在依然被广泛使用的分层应用开发模式 MVC(ModelView Controll ...

  6. SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 如题,今天介绍 Spring Data JPA 的使用. 什么是 Spring Data JPA 在介绍 Spri ...

  7. SpringBoot 实战:如何从零开发 “淘宝”

    疫情期间,不少人选择宅家购物. 但当你每天在"淘宝""京东""网易考拉"上剁手买买买,钱包瘪下去的时候,有没有考虑一下自己开发个商城呢? 钱 ...

  8. SpringBoot实战 之 异常处理篇

    在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,那该如何减少程序异常对用户体验的影响呢?其实方法很简单,对异常进行捕获,然 ...

  9. 32位数据源中没有mysql_[SpringBoot实战]快速配置多数据源(整合MyBatis)

    前言 由于业务需求,需要同时在SpringBoot中配置两套数据源(连接两个数据库),要求能做到service层在调用各数据库表的mapper时能够自动切换数据源,也就是mapper自动访问正确的数据 ...

  10. JWT认证原理、整合springboot实战应用

    JWT认证原理.整合springboot实战应用 1.什么是JWT 2.JWT能做什么 3.与传统的session认证做对比 4.JWT结构 5.JWT的封装方法 1.什么是JWT JWT(Json ...

最新文章

  1. (译) 函数式 JS #2: 函数!
  2. 计算机/ARM 系统
  3. Jmeter之定时器操作
  4. html随页面移动固定,div设置了position: fixed属性后如何可以做到随浏览器左右移动?...
  5. 华为模拟器-三次交换机、链路捆绑、单臂路由综合实验
  6. Qt中消息的机制原理
  7. 理解线程的挂起,sleep还有阻塞
  8. 海上瓶子下有东西吗_洗衣液瓶子我从来不扔,瓶身这样剪几刀,解决了很多家庭的大烦恼...
  9. base64编码在silverlight中的使用
  10. 如何在计算机命令内转换操作盘,如何在命令行窗口中从驱动器C切换到驱动器D...
  11. 大地坐标系是不是经纬度_批量导入经纬度点到奥维地图中
  12. 有关大学计算机基础考试的试题,大学计算机基础考试试题
  13. 施工部署主要不包括_施工部署编制内容不包括( )_学小易找答案
  14. 数据结构--算法达人修炼学习安排及方法指导
  15. 每天禅道超时任务、超时未开始任务发送飞书提醒
  16. python mysql就业情况_影响员工离职因素分析—Mysql/python
  17. 腾讯云轻量应用服务器部署Aria2+AriaNg下载工具
  18. Edge浏览器上方不展示收藏夹的内容
  19. 俞敏洪在清华终于说实话了·····
  20. 优维科技出席GOPS大会, EASYOPS企业版等你来

热门文章

  1. leetcode 名单 Insertion Sort List
  2. Spring MVC URL的映射问题 ;Spring MVC 跳转与iframe包含地址问题
  3. spark架构设计编程模型 02
  4. UIApplication委托信息(多任务)
  5. 借助JavaEE中Timer API实现定时关闭计算机的功能
  6. Jasperreports TextField自动换行
  7. C#WinForm开发在选项卡tab中集成加载多个窗体,通过选项卡切换窗体(超详细讲解)
  8. 阿里Seata的分布式事务实现
  9. 京东今天还在用 .NET 架构的原因是什么?
  10. 导出DataTable数据到Word或者Excel