从Spring 3.0开始,Spring对Java校验API(Java Validation API,又称JSR-303)提供了支持。在Spring MVC中要使用Java校验API的话,并不需要什么额外的配置。只要保证在类路径下包含这个Java API的实现即可,比如Hibernate Validator。
引入hibernate-validator:
1 | <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --> |
校验注解
所有的注解都位于javax.validation.constraints
和org.hibernate.validator.constraints
包中。下表列出了这些校验注解。
注解 | 描述 |
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer, 小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Past | 限制必须是一个过去的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@SafeHtml | 字符串是安全的html |
@URL | 字符串是合法的URL |
@NotBlank | 字符串必须有字符 |
@NotEmpty | 字符串不为NULL,集合有字符 |
@AssertFalse | 必须是false |
@AssertTrue | 必须是true |
使用校验注解配置实体类
新建一个表单实体类,并加上注解:
1 | import javax.validation.constraints.NotNull; |
message属性用于添加国际化支持,接下来需要做的就是创建一个名为ValidationMessages.properties的文件(默认叫这个,不区分大小写,放在src/main/resources路径下):
1 | name.msg=\u7528\u6237\u540D\u957F\u5EA6\u4E3A{min}\u5230{max}\u4E2A\u5B57\u7B26 |
ValidationMessages.properties文件中每条信息的key值对应于注解中message属性占位符的 值。同时,最小和最大长度在ValidationMessages.properties文件中有自己的占位符——{min}
和{max}
——它们会引用@Size
注解上所设置的min和max属性。
自定义校验规则
上面的注解都是较为简单的注解,实际编程中校验的规则可能五花八门。当自带的这些注解无法满足我们的需求时,我们也可以自定义校验注解。下面是一个自定义校验注解的基本格式:
1 | import javax.validation.Constraint; |
其中@Constraint
注解表明这个注解是用于规则校验的,validatedBy
属性表明用什么去校验,这里我们指定的类为MyConstraintValidator
。注解还包含了三个书属性,属性message
指定当校验不通过的时候提示什么信息。
接下来编写MyConstraintValidator
,代码如下所示:
1 | import javax.validation.ConstraintValidator; |
MyConstraintValidator
实现了ConstraintValidator
接口,该接口必须指定两个泛型,第一个泛型指的是上面定义的注解类型,第二个泛型表示校验对象的类型。MyConstraintValidator
实现了ConstraintValidator
接口的initialize
方法和isValid
方法。
initialize
方法用于该校验初始化的时候进行一些操作;isValid
方法用于编写校验逻辑,第一个参数为需要校验的值,第二个参数为校验上下文。
Spring JSP库
为了使用Spring JSP库,需要在JSP页首加入:
1 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> |
引入依赖:
1 | <!-- https://mvnrepository.com/artifact/jstl/jstl --> |
相关标签如下表所示:
JSP标签 | 描述 |
<sf:checkbox> | 渲染成一个HTML <input>标签,其中type属性设置为checkbox |
<sf:checkboxes> | 渲染成多个HTML <input>标签,其中type属性设置为checkbox |
<sf:errors> | 在一个HTML <span>中渲染输入域的错误 |
<sf:form> | 渲染成一个HTML <form>标签,并为其内部标签暴露绑定路径,用于数据绑定 |
<sf:hidden> | 渲染成一个HTML <input>标签,其中type属性设置为hidden |
<sf:input> | 渲染成一个HTML <input>标签,其中type属性设置为text |
<sf:label> | 渲染成一个HTML <label>标签 |
<sf:option> | 渲染成一个HTML <option>标签,其selected属性根据所绑定的值进行设置 |
<sf:options> | 按照绑定的集合、数组或Map,渲染成一个HTML <option>标签的列表 |
<sf:password> | 渲染成一个HTML <input>标签,其中type属性设置为password |
<sf:radiobutton> | 渲染成一个HTML <input>标签,其中type属性设置为radio |
<sf:radiobuttons> | 渲染成多个HTML <input>标签,其中type属性设置为radio |
<sf:select> | 渲染为一个HTML <select>标签 |
<sf:textarea> | 渲染为一个HTML <textarea>标签 |
1 | <%@ page language="java" contentType="text/html; charset=utf-8" |
<sf:form>
会渲染为一个HTML<form>
标签,也可以通过commandName
属性构建针对某个模型对象的上下文信息。这里设为form(待会在controller中传递到此页面)。
cssClass
属性可以给标签加上样式Class,用于在CSS中对其选中并修改样式。
path
属性指向实体类form对应的属性名称。如果将<sf:errors/>
标签的path属性设置为*的话,其将显示所有不满足校验的提示信息。
cssErrorClass
属性指定校验不通过时候除了<sf:errors/>
标签外的标签样式。
编写controller
Regester控制器如下所示:
1 | import javax.validation.Valid; |