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

简介: 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 . 重启服务器,进行相关的验证


对一些情况进行验证。


不输入用户名和密码时


微信图片_20211228223226.png


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



微信图片_20211228223255.png


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


微信图片_20211228223326.png


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

相关文章
|
11月前
|
XML 前端开发 Java
SpringMVC中资源国际化使用实践
SpringMVC中资源国际化使用实践
113 0
|
12月前
|
缓存 前端开发 Java
【SpringMVC】JSR 303与拦截器注解使用
【SpringMVC】JSR 303与拦截器注解使用
70 0
|
Java
SpringMVC-国际化
SpringMVC-国际化
57 0
|
12月前
|
监控 前端开发 Java
学习 [Spring MVC] 的JSR 303和拦截器,提高开发效率
学习 [Spring MVC] 的JSR 303和拦截器,提高开发效率
51 0
|
Java Spring
springmvc-国际化&中英文切换&文件上传&下载
springmvc-国际化&中英文切换&文件上传&下载
|
前端开发 Java 数据库连接
【SpringMVC】JSR 303与interceptor拦截器快速入门
JSR 303是Java规范请求(Java Specification Request)的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。 JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibe
|
编解码 前端开发 Java
springMVC--数据验证以及国际化
springMVC--数据验证以及国际化
123 0
|
前端开发 Java 应用服务中间件
Spring MVC-08循序渐进之国际化(基于Session-SessionLocaleResolver)
Spring MVC-08循序渐进之国际化(基于Session-SessionLocaleResolver)
65 0
|
前端开发 IDE Java
Spring MVC-08循序渐进之国际化(AcceptHeaderLocaleResolver)
Spring MVC-08循序渐进之国际化(AcceptHeaderLocaleResolver)
134 0
|
Java 数据库连接 API
Spring MVC-07循序渐进之验证器 下 (JSR 303验证)
Spring MVC-07循序渐进之验证器 下 (JSR 303验证)
81 0