使用注解的方式进行服务器端的数据校验。
Springmvc使用的是hibernate的校验框架validation(和hibernate没有任何关系)
1、校验思路:
页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。
2、具体需求:
商品修改,添加校验(校验商品名称长度,生产日期非空校验),如果校验出错,在页面显示错误信息。
3、校验环境的搭建
Hibernate的校验框架所需要的jar包,下载地址:点击打开链接
4、配置校验器
在springmvc的配置文件中添加配置校验器:
<!-- 配置校验器 -->
<!-- org.springframework.validation.beanvalidation.LocalValidatorFactoryBean为spring提供的一个校验接口,在这里面 除了可以指定hibernate的校验器之外,还可以指定其他的校验器;-->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 使用hibernate提供的org.hibernate.validator.HibernateValidator校验器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下的VAlidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 为CustomValidationMessages.properties,因为这个歌basename,所以,配置文件中,不需要写后缀properties-->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8"/>
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120"/>
</bean>
5、将校验器注入处理器适配器
<!-- validator=validator:在处理器适配器中注入校验器 方式一 -->
<mvc:annotation-driven conversion-service="conversionService" validator="validator">
</mvc:annotation-driven>
<!-- 将校验器注入到适配器中方式二 -->
<!-- 自定义webBinder -->
<bean id="customBinder" 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="customBinder"></property>
</bean>
6、在pojo中添加校验规则
package com.sky.ssm.po;
import java.util.Date;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import com.sky.ssm.controller.validation.ValidGroup1;
public class Items {
private Integer id;
//校验名称长度在1~30之间,
//message为 错误提示信息,{items.name.length.error}表示取配置文件中的信息
//groups:将此校验划分至那个分组,groups可以定义多个分组
<span style="background-color: rgb(255, 255, 102);"> @Size(min=1,max=30,message="{items.name.length.error}",groups={ValidGroup1.class})</span>
private String name;
private Double price;
private String pic;
//非空校验
<span style="background-color: rgb(255, 255, 102);"> @NotNull(message="{items.createtime.isNull}")</span>
private Date createtime;
<span style="white-space:pre"> </span>//省略....
}
在pojo中添加校验规则时,可以为其添加校验分组,groups,当不同的controller方法对一个pojo进行校验又需要不同的校验规则时,可以使用分组校验。
ValidGroup1.java
package com.sky.ssm.controller.validation;
/**
* 校验分组
* @author sk
* 此分组只校验商品名称的长度
*/
public interface ValidGroup1 {
//接口中不需要定义任何方法,仅是对不同的校验规则进行分组
}
7、编写错误信息提示文件
CustomValidationMessages.properties
#添加校验错误提示信息
items.name.length.error = 请输入1到30个字符的商品名称
items.createtime.isNull = 请输入商品的生产日期
8 捕获错误校验信息
<span style="background-color: rgb(255, 255, 102);">//在需要校验的pojo前面添加@Validated,在需要校验的pojo后边添加BindingResult bindingResult接收校验出错信息
//注意:@Validated和BindingResult是配对出现的,并且在形参里面的顺序是固定的(一前一后)
//value={ValidGroup1.class}:指定使用ValidGroup1分组的校验</span>
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model,HttpServletRequest request,Integer id,String name,
<span style="background-color: rgb(255, 255, 102);">@Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult</span>) throws Exception{
<span style="background-color: rgb(255, 255, 51);">//获取校验错误信息
if(bindingResult.hasErrors()){//如果有错误
//输出错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
for (ObjectError objectError : allErrors) {
//输出错误信息
System.out.println(objectError.getDefaultMessage());
}
//将错误信息传到页面
model.addAttribute("allErrors", allErrors);
//出错后重新回到商品的修改页面
return "items/editItems";<span style="color:#ffff66;">
}</span></span>
//调用service更新商品信息,页面需要将商品新传到此方法
itemsService.updateItems(id, itemsCustom);
//重定向到商品的查询列表
return "redirect:queryItems.action";
}
9 在页面显示校验错误信息
在controller方法中将错误信息传到页面
页面显示错误信息
<!-- 显示错误信息 -->
<c:if test="${allErrors != null}">
<c:forEach items="${allErrors }" var="error">
${error.defaultMessage }</br>
</c:forEach>
</c:if>
项目结构