上一章,我们学习了SpringMVC的自定义类型转换器,但是如果转换后的数据传递到Controller的方法中,忽然发现有某些属性为Null了,这怎么办?我们需要一种有效的数据校验机制,来对数据进行有效的校验。
一、什么是数据校验?
数据校验,顾名思义,就是对数据进行校验,比如在进行登录操作时,我们就需要对用户名和密码进行验证,最起码需要保证用户名和密码不能为空,其次还需要保证密码的长度在多少位之内,这就叫作数据校验。
数据校验分为客户端和服务端两种:
1、客户端校验:JS校验。
2、服务端校验:SpringMVC的validation、Struts的validation,都有自己的校验机制。
二、开发准备
1、添加JAR包
hibernate-validator-5.1.2.Final.jar
validation-api-1.1.0.Final.jar
2、MAVEN的话,需要引入以下依赖
<!-- jsr303 validation dependencies--> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>${javax.validation.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${hibernate.validator.version}</version> </dependency>
3、在spring-servlet.xml.xml中配置validator校验器
<!-- 校验器,配置validator --> <bean id=\"validator\" class=\"org.springframework.validation.beanvalidation.LocalValidatorFactoryBean\"> <property name=\"providerClass\" value=\"org.hibernate.validator.HibernateValidator\"></property> <property name=\"validationMessageSource\" ref=\"validationMessageSource\"></property> </bean> <!-- 配置validationMessageSource --> <bean id=\"validationMessageSource\" class=\"org.springframework.context.support.ReloadableResourceBundleMessageSource\"> <!-- 指定校验信息的资源文件的基本文件名称,不包括后缀,后缀默认是properties --> <property name=\"basenames\"> <list> <value>classpath:validation</value> </list> </property> <!-- 指定文件的编码 --> <property name=\"fileEncodings\" value=\"utf8\"></property> <!-- 对资源文件内容缓存的时间,单位秒 --> <property name=\"cacheSeconds\" value=\"120\"></property> </bean>
4、将校验器注册到适配器中
方法一(推荐,如果大家用的是注解式编程,推荐使用该方法):
<mvc:annotation-driven validator=\"validator\" />
方法二(如果大家使用非注解式变成,则可以按以下配置方法)
<!-- 自定义WebBinding --> <bean id=\"myWebBinding\" class=\"org.springframework.web.bind.support.ConfigurableWebBindingInitializer\"> <property name=\"validator\" ref=\"validator\" /> </bean> <!-- 适配器 --> <bean class=\"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter\"> <property name=\"webBindingInitializer\" ref=\"myWebBinding\" /> </bean>
5、validation.properties
在src/main/resources下创建validation.properties文件,该配置文件的作用就是存校验失败的提示信息,如下:
user.username.notnull=用户名不能为空
user.password.notnull=密码不能为空
user.password.size=密码长度必须为6-16位
三、具体开发
1、创建实体SysUser.java,并指定校验规则
package cn.itechyou.entity; import java.io.Serializable; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; public class SysUser implements Serializable { @NotNull(message = \"{user.username.notnull}\") private String username; @NotNull(message = \"{user.password.notnull}\") @Size(min = 6, max = 16, message = \"{user.password.size}\") private String password; //省略getter、setter }
注意:
1:{user.username.notnull}和{user.password.size}就是读取validation.properties配置文件中配置的信息。
2:使用注解对需要进行校验的属性进行绑定,而能够使这些注解生效的前提就是配置此前的几个步骤
2、在Controller中使用
package cn.itechyou.controller; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestMapping; import cn.itechyou.entity.SysUser; @Controller @RequestMapping(\"/user\") public class UserController { /** * 登录 * @param model * @param user * @param result * @return */ @RequestMapping(\"/login\") public String login(Model model,@Validated SysUser user,BindingResult result) { if(result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); for (ObjectError objectError : allErrors) { System.out.println(objectError.getDefaultMessage()); } model.addAttribute(\"errors\", allErrors); return \"login\"; } return \"success\"; } }
注意:@Validated作用是使SysUser类中的的注解生效,如果没有该注解,SysUser类中的注解则不会生效。BindingResult对象用来获取校验失败的信息(@NotNull中的message),与@Validated注解必须配对使用,一前一后。
四、运行结果
总结:其实使用起来还是很简单的,校验都为我们写好了,我们只需要使用注解配置上就好了。