Spring MVC 的validation校验

摘自

https://github.com/codingXiaxw/ssm2

1.加入Hibernate Validator的jar

这里写图片描述


2.在处理器适配器中配置校验器

在springmvc.xml中的自定义webBinder标签中加入如下标签:

 <property name="validator" ref="validator"/>

这里引入了一个validator,所以我们需要在springmvc.xml中还需要加入validator的配置:

<bean id="validator"
          class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <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>

然后在src包下创建一个CustomValidationMessages.properties文件,内容为:

#校验提示信息:items.name.length.error要写在java代码中
items.name.length.error=商品名称的长度请限制在130个字符
items.createtime.is.notnull=请输入商品的生产日期

3.校验规则

需求:商品信息提交时校验 ,商品生产日期不能为空,商品名称长度在1到30字符之间。

另外首先需要知道的是规则应该在pojo对象的相应属性上规定。

修改pojo的Items.java内容如下:

public class Items {
    private Integer id;

    @Size(min = 1,max = 30,message = "{items.name.length.error}")
    private String name;

    private Float price;

    private String pic;
    @NotNull(message="{items.createtime.is.notnull}")
    private Date createtime;

    private String detail;
}
省略了相应的setter和getter方法。

通过上面的操作我们定义了校验的规则,那么当违反了上述规则后我们该如何捕获错误呢?需要修改controller方法,在要校验的pojo前边加上@Validated注解,在editItemSubmit()方法中添加如下内容:

  //商品提交页面
    //itemsQueryVo是包装类型的pojo
    //在@Validated中定义使用ValidGroup1组下边的校验
    @RequestMapping("/editItemSubmit")
    public String editItemSubmit(Model model,Integer id,
                                 @Validated @ModelAttribute(value = "itemsCustom") ItemsCustom itemsCustom,
                                 BindingResult bindingResult,
                                 //上传图片
                                 MultipartFile pictureFile
                                 ) throws Exception
    {
        //输出校验错误信息
        //如果参数绑定时出错
        if (bindingResult.hasErrors())
        {
            //获取错误
            List<ObjectError> errors=bindingResult.getAllErrors();

            model.addAttribute("errors",errors);

            for (ObjectError error:errors)
            {
                //输出错误信息
                System.out.println(error.getDefaultMessage());
            }

            //如果校验错误,仍然回到商品修改页面
            return "editItem";

        }

      ....
}

然后是在页面editItem.jsp中展示错误:

<!--错误信息-->
<c:forEach items="${errors}" var="error">
<div color="red">${error.defaultMessage}<br/></div>
</c:forEach>

运行程序,在修改商品信息的页面当我们没有输入日起或是将商品名称超过了20个字符时便不能完成页面的跳转而是在该修改页面显示错误信息。

以上我们便通过Validation完成了校验。下面我们来谈谈分组校验:针对不同的controller方法通过分组校验达到个性化校验的目的。


4.分组校验

需求:修改商品修改功能,只校验生产日期不能为空。

第一步:创建分组接口,创建一个ValidGroup1.java接口:

public interface ValidGroup1
{
    //接口不定义方法,相当于接口就是个类型,只标识哪些校验规则属于该ValidGroup1分组
}

第二步:定义校验规则属于哪个校验分组:

 //通过groups指定此校验属于哪个分组,当然可以指定多个分组
    @NotNull(message="{items.createtime.is.notnull}",groups = {ValidGroup1.class})
    private Date createtime;

而属性name的校验规则没有添加groups属性。

第三步:在controller方法定义使用校验的分组。

   public String editItemSubmit(Model model,Integer id,
                                 @Validated(value = {ValidGroup1.class}) @ModelAttribute(value = "itemsCustom") ItemsCustom itemsCustom,
                                 BindingResult bindingResult,
                                 //上传图片
                                 MultipartFile pictureFile
                                 ) throws Exception
    {}

此时运行程序,在编辑商品信息页面中只会进行日期是否为空的校验,而不能进行商品名称信息的校验。因为在pojo的name属性中我们没有指定该校验规则属于哪个分组,所以在controller的方法中就无法定义使用该校验规则的分组,也就无法进行商品名称的校验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值