SpringMVC的数据验证和JSR 303国际化显示(十一)上

一. SpringMVC 的数据验证


数据验证,包括 正常用户的误操作,和恶意用户的恶意操作两种。 验证,可以分为前端验证和后端验证。 前端验证主要是通过 JS来进行的,不安全。 后端验证,是通过服务器后端代码进行验证的。


SpringMVC 的验证,可以采用两种形式。


1 . SpringMVC 提供的validation校验框架 进行验证, 实现 validator 接口。


2 . 利用 JSR 303 (Java 验证规范) 来进行验证数据。 采用在Bean 属性上面添加注解的形式。


通常采用 JSR 303 的形式进行验证。


二. validation 校验框架进行验证


二.一 校验框架重要的接口和类


SpringMVC 在validation 校验框架中,提供了几个重要的接口 和类。 在 spring-context-4.2.4.RELEASE.jar 里面。


1 . org.springframework.validation.Validator 接口


package org.springframework.validation;

public abstract interface Validator
{
  public abstract boolean supports(Class<?> paramClass);
  
  public abstract void validate(Object paramObject, Errors paramErrors);
}


有两个方法, supports() 验证能否对类 paramClass 进行校验。

validate() 方法,对目标类 paramObject 进行校验,校验后的数据存放到 paramErrors 中。


2 . org.springframework.validation.Errors 接口


用来存放错误信息的接口。 通过 reject()或者是rejectValue() 方法来进行添加错误信息。


有一个 BindingResult 接口扩展了该接口。 全称是: org.springframework.validation.BindingResult


3 . org.springframework.validation.ValidationUtils


提供了很多验证方法, 是一个验证字段属性是否存在错误的工具类。


主要有两个方法, rejectIfEmpty() 验证是否为空。 rejectIfEmptyOrWhitespace() 验证是否为空或者是空白字符串。


4 . org.springframework.validation.beanvalidation.LocalValidatorFactoryBean


将其定义到需要数据验证的Bean 中。 既实现了Spring 的validator 接口,也实现了 JSR303 的Validator 接口。


<mvc:annotation-driven></mvc:annotation-driven> 默认装载了 LocalValidatorFactoryBean,所以不需要手动显式实现。


二.二 Validator 验证数据的小例子(一)


这个,采用 @InitBinder 的方式,可以参考 第八章讲解 form:errors 标签时的例子。 去例子查看



(因为这一块不怎么重要,就不重复写代码了。 留下内容主要讲 JSR303)


二.二 Validator 验证数据的小例子(二)


这个,采用 注解的方式,进行注入进去。


1 . 后端, 创建UserValidator 验证器。 对用户名,密码,和年龄进行验证。


采用 @Repository 注解。


package com.yjl.validator;

import org.springframework.stereotype.Repository;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import com.yjl.pojo.User;

@Repository(value="userValidator")
public class UserValidator implements Validator{

    @Override
    public boolean supports(Class<?> paramClass) {
        return User.class.isAssignableFrom(paramClass);
    }

    @Override
    public void validate(Object target, Errors errors) {
        
        //1. 验证不为空
        ValidationUtils.rejectIfEmpty(errors,"name",null,"用户名不能为空");
        ValidationUtils.rejectIfEmpty(errors,"password",null,"密码不能为空");
        //2 .类型转换,进行更深入的验证。
        User user=(User)target;
        if(user.getName()!=null&&!"".equals(user.getName())){
            if(user.getName().length()>10){
                errors.rejectValue("name",null,"用户名不能超过10个字符");
            }
        }
        if(user.getPassword()!=null&&!"".equals(user.getPassword())){
            if(user.getPassword().length()>15||
                    user.getPassword().length()<6){
                errors.rejectValue("password",null,"密码长度在6~15之间");
            }
        }
        if(user.getAge()!=null){
            if(user.getAge()<18){
                errors.rejectValue("age",null,"别装嫩噢");
            }
        }
        
    }
}


2 .UserAction 处理,进行验证。


@Autowired
    @Qualifier(value="userValidator")
    private UserValidator userValidator;
    
    //转到登录的页面
    @RequestMapping(value="toLogin")
    public String toLogin(Model model){
        model.addAttribute("user",new User());
        return "user/login";
    }
    //绑定到user对象。
    @RequestMapping(value="login") 
    public String login(@ModelAttribute User user,Model model,Errors errors){
        model.addAttribute("user",user);
        //进行验证
        userValidator.validate(user, errors);
        if(errors.hasFieldErrors()){ //有错的话,就返回登录页面。
            return "user/login";
        }
        return "user/list";
    }


3 . springmvc.xml 配置文件中,要添加 com.yjl.validator 的扫描包。


    <context:component-scan base-package="com.yjl.action,com.yjl.validator"></context:component-scan>
    
    <mvc:annotation-driven></mvc:annotation-driven>


4 . 前端页面代码


<body>
    <h2>两个蝴蝶飞,数据验证使用</h2>
    <form:form commandName="user" action="login.action" method="post">
        <form:label path="name">姓名:</form:label>
        <form:input path="name"/>
        
        <form:errors path="name"></form:errors> <br/>
        
        <form:label path="password">密码:</form:label>
        <form:input path="password"/> <!--为了能看见值,这里用 form:input,而不是form:password -->
        <form:errors path="password"></form:errors> <br/>
        <form:label path="age">年龄:</form:label>
        <form:input path="age"/>
        <form:errors path="age"></form:errors> <br/>
        
        <form:button>提交</form:button>
    </form:form>
</body>


5 . 重启服务器,进行相关的验证


对一些情况进行验证。


不输入用户名和密码时


SpringMVC的数据验证和JSR 303国际化显示(十一)上


密码长度不够时,用户名是正常的



SpringMVC的数据验证和JSR 303国际化显示(十一)上


用户名长度过多,年龄输入过小时,


SpringMVC的数据验证和JSR 303国际化显示(十一)上


这就是springmvc 的validation 验证框架的简单使用,功能很简单,所以需要看下面的JSR 303的验证。

上一篇:《C++面向对象高效编程(第2版)》——2.25 统一建模语言(UML)


下一篇:SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识