第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析
关于spring中的validate注解后台校验的解析
在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节。比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间、成本、质量的博弈中必然会落后。所以把校验层抽象出来是必然的结果,下面说下几种解决方案。
1.简单的校验Demo
依赖:
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
Student:
import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
public class Student {
        @NotNull(message = "名字不能为空")
        private String name;
        @Size(min = 6, max = 30, message = "地址应该在6-30字符之间")
        private String address;
        @DecimalMax(value = "100.00", message = "体重有些超标哦")
        @DecimalMin(value = "60.00", message = "多吃点饭吧")
        private BigDecimal weight;
        private String friendName;
        @AssertTrue
        private Boolean isHaveFriend() {
            return friendName != null ? true : false;
        }
        @Future(message = "生日必须在当前实践之前")
        private Date birthday;
        @Pattern(regexp = "^(.+)@(.+)$", message = "邮箱的格式不合法")
        private String email;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        public BigDecimal getWeight() {
            return weight;
        }
        public void setWeight(BigDecimal weight) {
            this.weight = weight;
        }
        public String getFriendName() {
            return friendName;
        }
        public void setFriendName(String friendName) {
            this.friendName = friendName;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
    }
DemoTest:
import javax.validation.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
public class DemoTest {
        public static void main(String[] args) {
            Student xiaoming = getBean();
            List<String> validate = validate(xiaoming);
            validate.forEach(row -> {
                System.out.println(row.toString());
            });
        }
        private static Student getBean() {
            Student bean = new Student();
            bean.setName(null);
            bean.setAddress("北京");
            bean.setBirthday(new Date());
            bean.setFriendName(null);
            bean.setWeight(new BigDecimal(30));
            bean.setEmail("xiaogangfan163.com");
            return bean;
        }
        private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        public static <T> List<String> validate(T t) {
            Validator validator = factory.getValidator();
            Set<ConstraintViolation<T>> constraintViolations = validator.validate(t);
            List<String> messageList = new ArrayList<>();
            for (ConstraintViolation<T> constraintViolation : constraintViolations) {
                messageList.add(constraintViolation.getMessage());
            }
            return messageList;
        }
    }
2.SpringMVC中的应用:
实体类的注解还是和Student类一样,只是controller接值的时候需要做点改动如下:
// 使用@Valid 表明获取到的数据模型需要验证,传入的Errors对象就是验证出错之后的数据对象,包括校验错误的个数,具体的信息等
@RequestMapping(value="/register", method=RequestMethod.POST)
public String registerForm(
        @Valid @ModelAttribute Student stu, Errors error){
    logger.info("注册新用户");
    if ( error.hasErrors()) {
        logger.error("出错啦");
    }
    stuList.add(stu);
    logger.info("注册的用户信息:/n" + stu);
    return "login";
}
第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析的更多相关文章
- Spring实战第五章学习笔记————构建Spring Web应用程序
		Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ... 
- SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序
		SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序 快速开始 本指南将引导您完成创建“hello world”应用程序的过程,该应用程序在浏览器和服务器之间来回发送消 ... 
- 用 Sencha Touch 构建移动 web 应用程序
		Sencha Touch 是一个使用 HTML5.CSS3 和 JavaScript 语言构建的移动 web 应用程序框架,在本文中,学习如何应用您当前的 web 开发技能进行移动 web 开发.下载 ... 
- 第05章-构建Spring Web应用程序
		1. Spring MVC起步 1.1 跟踪Spring MVC的请求 前端控制器DispatcherServlet 请求旅程的第一站是Spring的DispatcherServlet.与大多数基于J ... 
- Spring学习(五)--构建Spring Web应用程序
		一.Spring MVC起步 看过猫和老鼠的小伙伴都可以想象Tom猫所制作的捕鼠器:它的目标 是发送一个小钢球,让它经过一系列稀奇古怪的装置,最后触发捕鼠 器.小钢球穿过各种复杂的配件,从一个斜坡上滚 ... 
- 构建移动Web应用程序的技术堆栈
		编写web应用程序时,有很多的技术决策.笔者最近回来编写现代Web应用程序,并希望总结一些曾经在开发周期过程中做了记录零散的想法.这篇文章是关于一套对笔者最近开发的项目有帮助的框架.笔者重温了一些最重 ... 
- 译自如何将Spring Cloud应用程序从Spring Boot 1.2迁移到1.3
		前言 笔者第三个Spring Cloud(版本为Spring Boot 1.2)类项目升级最新版本时遇到不少问题,本文内容是作者翻译Spring Cloud官网一位国外友人文章产生. 原文地址: Mi ... 
- web应用程序指识别中的指纹收集
		web应用程序指纹识别是入侵前的关键步骤,假设通过指纹识别能确定web应用程序的名称及版本号.下一步就可以在网上搜索已公开的漏洞.或网上搜到其源码然后进行白盒的漏洞挖掘. 指纹识别的核心原理是通过正則 ... 
- 第5章—构建Spring Web应用程序—SpringMVC详解
		SpringMVC详解 5.1.跟踪Springmvc的请求 SpringMVC的核心流程如下: 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求 ... 
随机推荐
- java浅拷贝和深拷贝
			转:http://blog.csdn.net/u014727260/article/details/55003402 实现clone的2点: 1,clone方法是Object类的一个方法,所以任何一个 ... 
- Spring源码解析 - BeanFactory接口体系解读
			不知道为什么看着Spring的源码,感触最深的是Spring对概念的抽象,所以我就先学接口了. BeanFactory是Spring IOC实现的基础,这边定义了一系列的接口,我们通过这些接口的学习, ... 
- (并查集  建立关系)食物链 -- POJ-- 1182
			链接: http://poj.org/problem?id=1182 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82830#probl ... 
- MFC中和定时器使用
			在MFC中和定时器相关的有三个函数: 1.设置定时器(定义一个定时器的属性): SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBAC ... 
- hdu 1163 Eddy's digital Roots 【九余数定理】
			http://acm.hdu.edu.cn/showproblem.php?pid=1163 九余数定理: 如果一个数的各个数位上的数字之和能被9整除,那么这个数能被9整除:如果一个数各个数位上的数字 ... 
- 团队项目第六周——事后诸葛亮分析(GG队)
			一.总结: 本次项目作为我们第一次团队集体开发的项目,使我们在项目开发以及团队合作方面都有了宝贵的 经验以及初步的认识: 从项目开发的方面来看: 通过本次项目,我们更进一步加强了自己的前端知识,并初步 ... 
- 开源WebGIS实施方案(六):空间数据(PostGIS)与GeoServer服务迁移
			研发环境的变更,或者研发完成进行项目现场实施.运维的时候,经常就会面临数据及服务的迁移,这其中就包含空间数据以及GeoServer服务的迁移工作. 这里需要提醒的是:如果采用的是类似的开源WebGIS ... 
- radom
			radom模块提供了随机生成对象的方法 Help on module random: NAME random - Random variable generators. FILE /usr/local ... 
- [翻译]NUnit---TearDown and SetUpFixture and Test Attributes(二十)
			TearDownAttribute (NUnit 2.0 / 2.5) 本特性在TestFixture内部使用,每个测试方法执行后调用的方法集.也可以在SetUpFixture中使用,在同一命名空间或 ... 
- VS2017常用快捷键整理
			项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示 Solution Explorer(解决方案资源管理器) Shift + Alt+ C = 添 ... 
