Spring MVC之表单验证
程序员文章站
2022-04-13 16:07:59
...
1. JSR303注解验证
JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现,Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint
注解验证所需的jar包:
validation-api-1.1.0. Final.jar
hibernate-validator-5.2.0.Final.jar
Spring提供了对Bean的功能验证,通过注解@Valid表明哪个Bean需要启动注解式的验证。
验证注解的定义:
注解 | 详细信息 |
---|---|
@Null | 被注解元素必须为null |
@NotNull | 被注释的元素必须不为null |
@AssertTrue | 被注释的元素必须为true |
@AssertFalse | 被注释的元素必须为false |
@Min(value) | 备注是的元素必须为一个数字,其值必须大于等于指定的最小值 |
@Max | 被注释的元素必须为一个数字,其值必须小于等于指定的最大值 |
@DecimalMin | 被注的元素必须为一个数字,其值必须大于等于指定的最小值 |
@DecimalMax | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max,min) | 被注释的元素必须在指定的范围之内 |
@Digits(integer,faction) | 被注释的元素是一个数字,必须在可接受的范围之内 |
@Past | 被注释的元素必须是一个过去的元素 |
@Future | 被注释的元素必须是一个将来的元素 |
@Pattern | 被注释的元素必须符合指定的正则表达式 |
案例:
使用控制器完成表单的验证:
package com.controller;
@Controller
public class ValidateController {
@RequestMapping("/annotation")
public ModelAndView annotationValidate(@Valid Transaction trans ,Errors errors) {
//是否存在错误
if(errors.hasErrors()) {
//获取错误信息
List<FieldError> errorList = errors.getFieldErrors();
for (FieldError error : errorList) {
//打印错误字段信息
System.out.println("file:"+ error.getField()+"\t"+"msg:"+error.getDefaultMessage());
}
}
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
return mav;
}
}
2. 验证器验证
有时候除了简单的输入格式、非空性的检验,也需要一定的业务检验,Spring提供了Validator接口来实现检验,他将在进入控制器逻辑之前对参数的合法性进行检验。
Validator接口是Spring MVC检验表单逻辑的核心接口。
//Validator源码
public interface Validator {
/*
* 判断当前的验证器是否检验clazz类型的POJO
* 返回true启动检验,返回false则不再检验
*/
boolean supports(Class<?> clazz);
/*
* 检验POJO的合法性
* target POJO的请求对象,errors 错误信息
*/
void validate(Object target, Errors errors);
}
他只是一个验证器,在Spring中最终被注册到验证器的列表中,这样可以提供给各个控制器去定义,然后通过supprots方法,判断是否通过验证器去验证数据。
对于检验的过程是通过validate方法来实现的。
案例:
/*
需要继承接口Validator
*/
public class TransactionValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
//判断是否为Transaction,如果是则进行验证
return Transaction.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Transaction transaction = (Transaction)target;
Double dis = transaction.getAmount() - (transaction.getQuantity() * transaction.getPrice());
//Math.abs()返回绝对值
if(Math.abs(dis)>0.01) {
errors.rejectValue("amount",null,"交易金额和购买数量与价格不匹配");
}
}
}
使用验证器验证时,需要将验证器和控制器捆绑在一起,使用@InitBinder注解
此时控制器代码为:
package com.controller;
@Controller
public class ValidateController {
@RequestMapping("/annotation")
public ModelAndView annotationValidate(@Valid Transaction trans ,Errors errors) {
//是否存在错误
if(errors.hasErrors()) {
//获取错误信息
List<FieldError> errorList = errors.getFieldErrors();
for (FieldError error : errorList) {
//打印错误字段信息
System.out.println("file:"+ error.getField()+"\t"+"msg:"+error.getDefaultMessage());
}
}
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
return mav;
}
//将验证器和控制器进行绑定
@InitBinder
public void initBinder(DataBinder binder) {
binder.setValidator(new TransactionValidator());
}
@RequestMapping("/validator")
public ModelAndView validate(@Valid Transaction trans ,Errors errors) {
//是否存在错误
if(errors.hasErrors()) {
//获取错误信息
List<FieldError> errorList = errors.getFieldErrors();
for (FieldError error : errorList) {
//打印错误字段信息
System.out.println("file:"+ error.getField()+"\t"+"msg"+error.getDefaultMessage());
}
}
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
return mav;
}
}
3. JSR303与验证器之间的关系
JSR303注解方式和验证器方法不能同时使用,不过可以使用JSR303注解方式得到基本的验证信息后,再使用自己的方法进行验证。
推荐阅读
-
ASP.NET MVC5网站开发之登录、验证和注销管理员篇1(六)
-
Spring MVC之DispatcherServlet详解_动力节点Java学院整理
-
Spring MVC之DispatcherServlet_动力节点Java学院整理
-
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
-
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
-
详解小程序之简单登录注册表单验证
-
jQuery表单验证之密码确认
-
AngularJS学习笔记之表单验证功能实例详解
-
Vue ElementUI之Form表单验证遇到的问题
-
HTML5中custom data-*特性与asp.net mvc 3 表单验证