Validation校验

springMVChibernate的验证接口(JSR-380)一起使用。

一般在开发中,数据验证是利用springMVC自带的验证接口与hibernate的验证接口(JSR-380)一起使用,实现一个效果完美的数据验证。


1.导入jar包
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>4.1.0.Final</version>
    </dependency>
2.配置validator
    <!-- 校验器 -->
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <!-- hibernate校验器-->
        <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">
        <!-- 资源文件名-->
        <property name="basenames">
            <list>
                <value>CustomValidationMessages</value>
            </list>
        </property>
        <!-- 资源文件编码格式 -->
        <property name="fileEncodings" value="utf-8"/>
        <!-- 对资源文件内容缓存时间,单位秒 -->
        <property name="cacheSeconds" value="120"/>
    </bean>
    <!-- 全局异常处理器
    只要实现HandlerExceptionResolver接口就是全局异常处理器-->
    <bean class="cn.itcast.ssm.exception.CustomExceptionResolver"></bean>
3.将validator加到处理器适配器
<!-- validator="validator"注入了校验器-->
    <mvc:annotation-driven  validator="validator"></mvc:annotation-driven>
4.添加验证规则
public class Items {
    private Integer id;

    //校验名称在1到30字符中间
    //message是提示校验出错显示的信息
    //groups:此校验属于哪个分组,groups可以定义多个分组(后面扩展)
    @Size(min=1,max=30,message="{items.name.length.error}",groups={ValidGroup1.class})
    private String name;

    private Float price;

    private String pic;

    //非空校验
    @NotNull(message="{items.createtime.isNUll}")
    private Date createtime;
5.错误消息文件
items.name.length.error=名称在10-30个字符之间
items.createtime.isNUll=请添加内容
在项目的资源文件目录下添加一个错误日志文件xxxxxxx.properties

6.捕获错误controller编写
// 在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult
	// bindingResult接收校验出错信息
	// 注意:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。
	// value={ValidGroup1.class}指定使用ValidGroup1分组的 校验
	// @ModelAttribute可以指定pojo回显到页面在request中的key
	@RequestMapping("/editItemsSubmit")
	public String editItemsSubmit(
			Model model,
			HttpServletRequest request,
			Integer id,
			@ModelAttribute("items") @Validated(value = { ValidGroup1.class }) ItemsCustom itemsCustom,
			BindingResult bindingResult,
			MultipartFile items_pic//接收商品图片
			) throws Exception {

		// 获取校验错误信息
		if (bindingResult.hasErrors()) {
			// 输出错误信息
			List<ObjectError> allErrors = bindingResult.getAllErrors();

			for (ObjectError objectError : allErrors) {
				// 输出错误信息
				System.out.println(objectError.getDefaultMessage());

			}
			// 将错误信息传到页面
			model.addAttribute("allErrors", allErrors);
			
			
			//可以直接使用model将提交pojo回显到页面
			model.addAttribute("items", itemsCustom);
			
			// 出错重新到商品修改页面
			return "items/editItems";
		}

注意:添加@Validated表示在对items参数绑定时进行校验,校验信息写入BindingResult中,在要校验的pojo后边添加BingdingResult, 一个BindingResult对应一个pojo,且BingdingResult放在pojo的后边。

7.分组校验(扩展)
有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下使用不同验证方式,比如说对于一个实体类来的id来说,保存的时候是不需要的,对于更新时是必须的,可以如下配置:
  1. public class UserModel {  
  2.   
  3.     @NotNull(message = "{id.empty}", groups = { First.class })  
  4.     private int id;  
  5.   
  6.     @NotNull(message = "{username.empty}", groups = { First.class, Second.class })  
  7.     private String username;  
  8.   
  9.     @NotNull(message = "{content.empty}", groups = { First.class, Second.class })  
  10.     private String content;  
  11.   
  12.     public int getId() {  
  13.         return id;  
  14.     }  
  15.   
  16.     public void setId(int id) {  
  17.         this.id = id;  
  18.     }  
  19.   
  20.     public String getUsername() {  
  21.         return username;  
  22.     }  
  23.   
  24.     public void setUsername(String username) {  
  25.         this.username = username;  
  26.     }  
  27.   
  28.     public String getContent() {  
  29.         return content;  
  30.     }  
  31.   
  32.     public void setContent(String content) {  
  33.         this.content = content;  
  34.     }  
  35. }  
  36. public interface First {  
  37. }  
  38.   
  39. public interface Second {  
  40. }  


通过 groups 对验证进行分组

在controler中的代码如下:

  1. @RequestMapping(value = "/save.action", method = RequestMethod.POST)  
  2. public String save(@Validated( { Second.class }) UserModel userModel, BindingResult result) {  
  3.     if (result.hasErrors()) {  
  4.         return "validate/error";  
  5.     }  
  6.     return "redirect:/success";  
  7. }  
  8.   
  9. @RequestMapping(value = "/update.action", method = RequestMethod.POST)  
  10. public String update(@Validated( { First.class, Second.class }) UserModel user, BindingResult result) {  
  11.     if (result.hasErrors()) {  
  12.         return "validate/error";  
  13.     }  
  14.     return "redirect:/success";  
  15. }  


8.校验注解

@Null   被注释的元素必须为 null   

@NotNull    被注释的元素必须不为 null   

@AssertTrue     被注释的元素必须为 true   

@AssertFalse    被注释的元素必须为 false   

@Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值   

@Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值   

@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值   

@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值   

@Size(max=, min=)   被注释的元素的大小必须在指定的范围内   

@Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内   

@Past   被注释的元素必须是一个过去的日期   

@Future     被注释的元素必须是一个将来的日期   

@Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式   

Hibernate Validator 附加的 constraint   

@NotBlank(message =)   验证字符串非null,且长度必须大于0   

@Email  被注释的元素必须是电子邮箱地址   

@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内   

@NotEmpty   被注释的字符串的必须非空   

@Range(min=,max=,message=)  被注释的元素必须在合适的范围内


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值