springmvc注解开发-validation校验

使用注解的方式进行服务器端的数据校验。

 

Springmvc使用的是hibernate的校验框架validation(和hibernate没有任何关系)

1、校验思路:

页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。

2、具体需求:

商品修改,添加校验(校验商品名称长度,生产日期非空校验),如果校验出错,在页面显示错误信息。

3、校验环境的搭建

Hibernate的校验框架所需要的jar包,下载地址:点击打开链接

springmvc注解开发-validation校验

 

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>
  1.  

 

5、将校验器注入处理器适配器

<!-- validator=validator:在处理器适配器中注入校验器 方式一 -->

<mvc:annotation-driven conversion-service="conversionService" validator="validator">

</mvc:annotation-driven>
  1.  

 

<!-- 将校验器注入到适配器中方式二 -->

<!-- 自定义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>
  1.  

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>//省略....

}
  1.  

在pojo中添加校验规则时,可以为其添加校验分组,groups,当不同的controller方法对一个pojo进行校验又需要不同的校验规则时,可以使用分组校验。

ValidGroup1.java

 

package com.sky.ssm.controller.validation;

/**

* 校验分组

* @author sk

* 此分组只校验商品名称的长度

*/

public interface ValidGroup1 {

//接口中不需要定义任何方法,仅是对不同的校验规则进行分组

}
  1.  

 

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";

}
  1.  

9 在页面显示校验错误信息

在controller方法中将错误信息传到页面

页面显示错误信息

<!-- 显示错误信息 -->

<c:if test="${allErrors != null}">

<c:forEach items="${allErrors }" var="error">

${error.defaultMessage }</br>

</c:forEach>

</c:if>
  1.  


项目结构

springmvc注解开发-validation校验
 

上一篇:[WPF 自定义控件]自定义一个“传统”的 Validation.ErrorTemplate


下一篇:[NestJS] NestJs Data Validation with ValidationPipe