天天看点

SpringMVC数据校验

对前端的校验大多数通过js在页面校验,这种方法比较简单,如果对安全性考虑,还要在后台校验。

springmvc使用JSR-303(javaEE6规范的一部分)校验规范,springmvc使用的是Hibernate Validator(和Hibernate的ORM)

加入Hibernate Validator的jar

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.1.Final</version>
</dependency>

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>      

配置springmvc.xml

在spring3之后,任何支持JSR303的validator(如Hibernate Validator)都可以通过简单配置引入,只需要在配置xml中加入,这时validatemessage的属性文件默认为classpath下的ValidationMessages.properties:

<mvc:annotation-driven      

如果不使用默认,可以使用下面配置:

<mvc:annotation-driven validator="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="validatemessageSource"/>
</bean>
<bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <!-- validatemessages.properties文件 --> 
    <property name="basename" value="classpath:validatemessages"/>  
    <property name="fileEncodings" value="utf-8"/>  
    <property name="cacheSeconds" value="120"/>  
</bean>      

配置validatemessages.properties

#校验提示信息,items.name.length.error要写在java代码中
items.name.length.error=商品名称长度错误      

校验bean

public class Items
    private Integer id;

    //商品名称的长度请限制在1到30个字符
    @Size(min=1,max=30,message="{items.name.length.error}")
    private String name;

    private Float price;

    private String pic;

    //请输入商品生产日期
    //通过groups指定此校验属于哪个分组,可以指定多个分组
    @NotNull(message="{items.createtime.is.notnull}")
    private      

controller中捕获错误

需要修改controller方法,在要校验的pojo前边加上@Validated

public String editItemSubmit(Model model,Integer id,
                @Validated @ModelAttribute(value="itemsCustom") ItemsCustom itemsCustom,
                BindingResult bindingResult
            )throws Exception{

        //输出校验错误信息
        //如果参数绑定时有错
        if(bindingResult.hasErrors()){

            //获取错误 
            List<ObjectError> errors = bindingResult.getAllErrors();
            //准备在页面输出errors,页面使用jstl遍历
            model.addAttribute("errors", errors);
            for(ObjectError error:errors){
                //输出错误信息
                System.out.println(error.getDefaultMessage());
            }
            //如果校验错误,回到商品修改页面
            return "editItem";
        }      

注意:每个校验的pojo前面必须加@Validated,每个校验的pojo后面要加bindingResult接受校验错误信息

分组校验(常用)

需求:

针对不同的controller方法通过分组校验达到个性化校验的目的,修改商品修改功能,只校验生产日期不能为空。

第一步:创建分组接口

public interface ValidGroup1 {
    //接口不定义方法,就是只标识 哪些校验 规则属于该 ValidGroup1分组      
public class Items {  
    //请输入商品生产日期
    //通过groups指定此校验属于哪个分组,可以指定多个分组
    @NotNull(message="{items.createtime.is.notnull}",groups={ValidGroup1.class})
    private      
//在@Validated中定义使用ValidGroup1组下边的校验
public String editItemSubmit(Model model,Integer id,
                @Validated(value={ValidGroup1.class}) @ModelAttribute(value="itemsCustom") ItemsCustom itemsCustom,
                BindingResult bindingResult
            )throws Exception{
}