springMVC之数据校验

1、 项目中使用较多的是前端校验

       比如页面中js校验。对于安全要求较高的话建议在服务端进行校验。

2、 服务端校验

控制层controller:校验页面请求的参数合法性

业务层service:主要校验关键业务参数,仅限于service接口中使用的参数

持久层dao:一般是不校验的

3、 springmvc的校验

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

3.1、导入相关jar包

 

3.2、配置校验器

    <!-- 配置校验器 -->
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <!-- 加载数据校验的消息文件 -->
        <property name="basenames">
            <list>
                <value>classpath:UserValidationMessage</value>
            </list>
        </property>
        <!-- 资源文件中内容的缓存时间 单位秒 -->
        <property name="cacheSeconds" value="120"></property>
        <!-- 资源文件的编码方式 -->
        <property name="fileEncodings" value="utf-8"></property>
    </bean>
    <!-- 实例化一个校验器对象 -->
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <!-- 注入一个具体的校验器:该数据校验器由hibernate-validator.jar提供 -->
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
        <!-- 加载message资源文件 -->
        <property name="validationMessageSource" ref="messageSource"></property>
    </bean>
    <!-- 开启注解解析器 -->
    <mvc:annotation-driven validator="validator"></mvc:annotation-driven>

3.3、在vo或者pojo添加校验规则

public class User {
    // 校验名称在1~6字符中间
    @Size(min=1,max=6,message="{user_name.length}")
    private String name;
    // 校验非空
    @NotEmpty(message="{user_pwd.notNull}")
    private String pwd;
    // 校验是否为数字,并且在规定的大小值内
    @Max(value=150, message="{user_age.Number}")
    @Min(value=1, message="{user_age.Number}")
    private Integer age;
    // 校验是否为邮件格式
    @Email(message="{user_email.email}")
    private String email;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", pwd=" + pwd + ", age=" + age
                + ", email=" + email + "]";
    }
}

3.4、编写校验资源文件

3.5、捕获校验信息并传往页面

    /**
     * @Validated 表示对哪个参数进行校验
     * @param user
     * @param bindingResult 接收校验提示信息
     * @return
     * 注意:@Validated和BindingResult是配对出现,而且形参顺序是固定
     */
    @RequestMapping("/register")
    public String register(@Validated User user, BindingResult bindingResult, Model model) {
        // 获取校验信息
        if(bindingResult.hasErrors()) {
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for (ObjectError objectError : allErrors) {
                System.out.println(objectError.getDefaultMessage());
            }        
            // 将错误信息传到页面
            model.addAttribute("allErrors", allErrors);
            return "/register.jsp";
        }
        return "/index.jsp";
    }

3.6、jsp页面

      <c:if test="${allErrors != null }">
          <c:forEach items="${allErrors }" var="error">
              <span style="color: red;">${error.defaultMessage }</span>
          </c:forEach>
      </c:if>
  
      <form action="register.do" method="post">
          用户名:<input name="name"/><br/>
          密码:<input name="pwd"/><br/>
          年龄:<input name="age"/><br/>
          邮箱:<input name="email"/><br/>
          <input type="submit" value="注册"/>
      </form>

4、 分组校验

       当需要不同的controller方法对同一个对象进行校验,但是每个controller方法需要不同的校验时,需要分组校验

       4.1 定义分组校验(其实就是一个java接口),分组中定义有哪些规则

public interface ValidateGroup1 {
    // 接口中不需要定义任何方法,仅是对不同的校验进行分组
    // 此分组只校验用户名、密码
}

       4.2 在校验规则中添加分组

    // 校验名称在1~6字符中间
    @Size(min=1,max=6,message="{user_name.length}", groups={ValidateGroup1.class})
    private String name;
    // 校验非空
    @NotEmpty(message="{user_pwd.notNull}", groups={ValidateGroup1.class})

       4.3 使用指定分组校验

    @RequestMapping("/login")
    public String login(@Validated(value={ValidateGroup1.class}) User user, BindingResult bindingResult, Model model) {
        // 获取校验信息
        if(bindingResult.hasErrors()) {
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for (ObjectError objectError : allErrors) {
                System.out.println(objectError.getDefaultMessage());
            }        
            // 将错误信息传到页面
            model.addAttribute("allErrors", allErrors);
            return "/login.jsp";
        }
        return "/index.jsp";
    }

 

posted @ 2018-07-08 21:29  莯汐  阅读(126)  评论(0)    收藏  举报