zoukankan      html  css  js  c++  java
  • 《SpringMVC从入门到放肆》十三、SpringMVC数据校验

    上一章,我们学习了SpringMVC的自定义类型转换器,但是如果转换后的数据传递到Controller的方法中,忽然发现有某些属性为Null了,这怎么办?我们需要一种有效的数据校验机制,来对数据进行有效的校验。

    一、什么是数据校验?

    数据校验,顾名思义,就是对数据进行校验,比如在进行登录操作时,我们就需要对用户名和密码进行验证,最起码需要保证用户名和密码不能为空,其次还需要保证密码的长度在多少位之内,这就叫作数据校验。

    数据校验分为客户端和服务端两种:

    1、客户端校验:JS校验。

    2、服务端校验:SpringMVC的validation、Struts的validation,都有自己的校验机制。

    二、开发准备

    1、添加JAR包

    hibernate-validator-5.1.2.Final.jar

    validation-api-1.1.0.Final.jar

    2、MAVEN的话,需要引入以下依赖

    <!-- jsr303 validation dependencies-->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>${javax.validation.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>${hibernate.validator.version}</version>
    </dependency>

    3、在spring-servlet.xml.xml中配置validator校验器

    <!-- 校验器,配置validator -->
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
        <property name="validationMessageSource" ref="validationMessageSource"></property>
    </bean>
    
    <!-- 配置validationMessageSource -->
    <bean id="validationMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <!-- 指定校验信息的资源文件的基本文件名称,不包括后缀,后缀默认是properties -->
        <property name="basenames">
            <list>
                <value>classpath:validation</value>
            </list>
        </property>
        <!-- 指定文件的编码 -->
        <property name="fileEncodings" value="utf8"></property>
        <!-- 对资源文件内容缓存的时间,单位秒 -->
        <property name="cacheSeconds" value="120"></property>
    </bean>

    4、将校验器注册到适配器中

    方法一(推荐,如果大家用的是注解式编程,推荐使用该方法):

    <mvc:annotation-driven validator="validator" />

    方法二(如果大家使用非注解式变成,则可以按以下配置方法)

    <!-- 自定义WebBinding -->
    <bean id="myWebBinding" 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="myWebBinding" />
    </bean>

    5、validation.properties

    在src/main/resources下创建validation.properties文件,该配置文件的作用就是存校验失败的提示信息,如下:

    user.username.notnull=用户名不能为空
    user.password.notnull=密码不能为空
    user.password.size=密码长度必须为6-16位

    三、具体开发

    1、创建实体SysUser.java,并指定校验规则

    package cn.itechyou.entity;
    
    import java.io.Serializable;
    
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    
    public class SysUser implements Serializable {
        @NotNull(message = "{user.username.notnull}")
        private String username;
        @NotNull(message = "{user.password.notnull}")
        @Size(min = 6, max = 16, message = "{user.password.size}")
        private String password;
    
        //省略getter、setter
    }

    注意:

    1:{user.username.notnull}和{user.password.size}就是读取validation.properties配置文件中配置的信息。

    2:使用注解对需要进行校验的属性进行绑定,而能够使这些注解生效的前提就是配置此前的几个步骤

    2、在Controller中使用

    package cn.itechyou.controller;
    
    import java.util.List;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.ObjectError;
    import org.springframework.validation.annotation.Validated;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import cn.itechyou.entity.SysUser;
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
        
        /**
         * 登录
         * @param model
         * @param user
         * @param result
         * @return
         */
        @RequestMapping("/login")
        public String login(Model model,@Validated SysUser user,BindingResult result) {
            if(result.hasErrors()) {
                List<ObjectError> allErrors = result.getAllErrors();
                for (ObjectError objectError : allErrors) {
                    System.out.println(objectError.getDefaultMessage());
                }
                model.addAttribute("errors", allErrors);
                return "login";
            }
            return "success";
        }
    }

    注意:@Validated作用是使SysUser类中的的注解生效,如果没有该注解,SysUser类中的注解则不会生效。BindingResult对象用来获取校验失败的信息(@NotNull中的message),与@Validated注解必须配对使用,一前一后。

    四、运行结果

     

    总结:其实使用起来还是很简单的,校验都为我们写好了,我们只需要使用注解配置上就好了。

  • 相关阅读:
    从‘void*’到‘int’的转换损失精度
    ../lib//libscsdblog.so: undefined reference to `pthread_atfork'
    使用Crypto++库的CBC模式实现加密
    VIM常用命令
    mysql bin-log三种模式
    windows64位Oracle安装和PL/SQL配置
    Maven项目中突然找不到Build Path或maven dependencies library
    org.springframework.beans.factory.config.MethodInvokingFactoryBean的使用
    使用Spring的StingUtils的commaDelimitedListToStringArray来获取字符串数组
    Spring注入
  • 原文地址:https://www.cnblogs.com/xinhudong/p/10571121.html
Copyright © 2011-2022 走看看