springmvc的@Validated/@Valid注解使用和BindingResult bindingResult
关于@Valid和Validated的比较
@Valid是使用hibernate validation的时候使用
@Validated 是只用spring Validator 校验机制使用
一:@Validated 是只用spring Validator 校验机制使用
@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。
例如:
1 | @ModelAttribute( "student" )是创建的一个 new student()类, 用来验证前台提交的数据student是否正确(@Validated Student student) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @RequestMapping(value = "/addStudent" , method = RequestMethod.POST) public String addStudent(@ModelAttribute( "student" ) @Validated Student student, BindingResult bindingResult, Model model) { if (bindingResult.hasErrors()) { return "student" ; } model.addAttribute( "name" , student.getName()); model.addAttribute( "age" , student.getAge()); model.addAttribute( "id" , student.getId()); return "student_result" ; } |
前台提交的数据:
前台commandName="student"绑定了student类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <%@ page language= "java" contentType= "text/html; charset=utf-8" pageEncoding= "utf-8" %> <%@ taglib uri= "http://www.springframework.org/tags/form" prefix= "form" %> <%@ taglib uri= "http://java.sun.com/jsp/jstl/core" prefix= "c" %> <%@ page isELIgnored= "false" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head> <meta http-equiv= "Content-Type" content= "text/html; charset=utf-8" > <title>Spring MVC表单处理</title> </head> <style> .error { color: #ff0000; } .errorStyle { color: #000; background-color: #ffEEEE; border: 3px solid #ff0000; padding: 8px; margin: 16px; } </style> <body> <h2>学生信息</h2> <form:form method= "POST" action= "/hello/addStudent" commandName= "student" > <form:errors path= "*" cssClass= "errorStyle" element= "div" /> <table> <tr> <td><form:label path= "name" >姓名:</form:label></td> <td><form:input path= "name" /></td> <td><form:errors path= "name" cssClass= "error" /></td> </tr> <tr> <td><form:label path= "age" >年龄:</form:label></td> <td><form:input path= "age" /></td> </tr> <tr> <td><form:label path= "id" >编号:</form:label></td> <td><form:input path= "id" /></td> </tr> <tr> <td colspan= "2" ><input type= "submit" value= "提交" /></td> </tr> </table> </form:form> </body> </html> |
全代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.Validator; import org.springframework.validation.annotation.Validated; @Controller public class StudentController { @Autowired @Qualifier( "studentValidator" ) private Validator validator; @InitBinder private void initBinder(WebDataBinder binder) { binder.setValidator(validator); } //前端from数据引用:commandName @ModelAttribute( "student" ) public Student createStudentModel() { return new Student(); } @RequestMapping(value = "/student" , method = RequestMethod.GET) public ModelAndView student() { return new ModelAndView( "student" , "command" , new Student()); } @RequestMapping(value = "/addStudent" , method = RequestMethod.POST) public String addStudent(@ModelAttribute( "student" ) @Validated Student student, BindingResult bindingResult, Model model) { if (bindingResult.hasErrors()) { return "student" ; } model.addAttribute( "name" , student.getName()); model.addAttribute( "age" , student.getAge()); model.addAttribute( "id" , student.getId()); return "student_result" ; } } |
二:@Valid是使用hibernate validation的时候使用
@Valid
看看下面的依赖就知道,java的JSR303声明了这类接口,然后hibernate-validator对其进行了实现。
1 2 3 4 5 6 7 8 9 10 11 12 | <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.1.Final</version> </dependency> |
JSR303定义的校验类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | 空检查 @Null 验证对象是否为 null @NotNull 验证对象是否不为 null , 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格. @NotEmpty 检查约束元素是否为NULL或者是EMPTY. Booelan检查 @AssertTrue 验证 Boolean 对象是否为 true @AssertFalse 验证 Boolean 对象是否为 false 长度检查 @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 @Length(min=, max=) Validates that the annotated string is between min and max included. 日期检查 @Past 验证 Date 和 Calendar 对象是否在当前时间之前 @Future 验证 Date 和 Calendar 对象是否在当前时间之后 @Pattern 验证 String 对象是否符合正则表达式的规则 数值检查,建议使用在Stirng,Integer类型,不建议使用在 int 类型上,因为表单值为“”时无法转换为 int ,但可以转换为Stirng为 "" ,Integer为 null @Min 验证 Number 和 String 对象是否大等于指定的值 @Max 验证 Number 和 String 对象是否小等于指定的值 @DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度 @DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度 @Digits 验证 Number 和 String 的构成是否合法 @Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。 @Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum. @Range(min=10000,max=50000,message= "range.bean.wage" ) private BigDecimal wage; @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证) @CreditCardNumber信用卡验证 @Email 验证是否是邮件地址,如果为 null ,不进行验证,算通过验证。 @ScriptAssert(lang= ,script=, alias=) @URL(protocol=,host=, port=,regexp=, flags=) |
例如:
1 2 3 4 5 6 7 8 9 | public class user{ @NotNull @Length(min = 1,max = 5) private String name; @Size(min=1,max=5) private int pasWord } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @RequestMapping(value = "/create" , method = RequestMethod.POST) @ResponseBody BlackDisck createUser(@ModelAttribute @Valid User user, BindingResult result) { if (result.hasErrors()) { List<ObjectError> errorList = result.getAllErrors(); for (ObjectError error : errorList) { System. out .println(error.getCode()+ " msg=" + error.getDefaultMessage()); } return null ; } .......... } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2017-05-22 phalcon:整合官方多模块功能,方便多表查询