在 Web 应用程序中,为了防止客户端传来的数据引发程序的异常,常常需要对数据进行验证。

输入验证分为客户端验证与服务器端验证。客户端验证主要通过 JavaScript 脚本进 行,

而服务器端验证则主要是通过 Java 代码进行验证。

为了保证数据的安全性,一般情况下,客户端验证与服务器端验证都是要进行的。

我们这里所讲的是 SpringMVC 在服务端是如何对数据进行验证的。

搭建测试环境

  1.导入Jar包

  SpringMVC 支持 JSR(Java Specification Requests,Java 规范提案)303 - Bean Validation数据验证规范。

  而该规范的实现者很多,其中较常用的是 Hibernate Validator。需要注意的是, Hibernate Validator 是与

  Hibernate ORM 并列的 Hibernate 的产品之一。这一点从 Hibernate 官 网上所提供的资源形式可以看出它们之间的关系。 

  所以,除了 SpringMVC 的 Jar 包外,我们还需要导入 Hibernate Validator 的 Jar 包。

  这些Jar 包,可以从 Hibernate 官网中直接下载

实现数据验证

  1.修改springmvc配置文件

    验证器由SpringMVC框架的LocalValidtorFactoryBean类生成,而真正验证器的提供者是HibernateValidator

    在SpringMVC 配置文件中 将验证器注册后,需要将其注入给注解驱动

  

 <!-- 验证器 由 SpringMVC框架的 LocalValidtorFactoryBean 类生成 ,而真正的验证器的提供者 则是 HibernateValidator -->
<!-- 验证器注册完成后,需要将其注入给注解驱动 --> <!-- 注册验证器 -->
<bean id="myValidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
</bean> <mvc:annotation-driven validator="myValidator"/>

  2.在实体属性上添加验证注解

  使用的验证器注解均是 javax.validation.constraints包中的类

  在注解的message属性中,可以使用 {属性名}的方式来引用指定的注解的属性值

 //在实体属性上添加验证注解
//使用的验证注解 均为 javax.validation.constraints
//在注解的 message(不满足验证条件后的返回的提示信息) 中,可以使用 {属性名} 的方式,来引用属性的 值
public class Person {
@NotEmpty(message="用户名不能为空")
@Size(min=3,max=6,message="用户名长度应为 {min} - {max}位")
private String name; @Max(value=100,message="分数不能超过 {value}")
@Min(value=0,message="分数不能低于 {value}")
private double score; @NotEmpty(message="手机号不能为空")
@Pattern(regexp="^1[34578]\\d{9}$",message="手机号码格式不正确")
private String phoneNumber;
public String getName() {
return name;
}

  NotNull 和 NotEmpty区别:

    NotNull:验证注解的元素值不为 null

    NotEmpty:验证注解的元素值不为 null 且不为空(字符串长度不为 0、集合大小不为 0)

  

  3.修改Controller

 public class MyController {

     // 数据验证
//由于这里使用的 验证器为 Bean 对象验证器,所以对于要验证的参数数据,需是一个Bean 类型,使用 @Validated 标记这是要检验的 Bean
//注: 不能将 @Validated 注解在String类型与基本类型的形参前
// 通过 BindingResult 形参 可以获取到所有验证异常信息 (message 里面的)
@RequestMapping(value = "/validator.do")
public ModelAndView register(@Validated Person person,BindingResult br) {
ModelAndView mv = new ModelAndView();
//获取到所有的异常信息,如果没有异常,List也不会 为 null,而是 size = 0;
List<ObjectError> errors = br.getAllErrors();
System.out.println(errors.size());
//如果存在验证异常
if(errors.size()>0) {
//获取指定属性的异常信息
FieldError nameError = br.getFieldError("name");
FieldError scoreError = br.getFieldError("score");
FieldError phoneNumberError = br.getFieldError("phoneNumber"); //哪个FileError 不为空(即该属性不符合验证条件),则将对应的错误信息存入ModelAndView
if(nameError != null) { //如果不满足多个验证条件,如:不填 同时不满足 (1、不为空,2、3-6字符,)错误信息好像随机选一个的
mv.addObject("nameError", nameError.getDefaultMessage());
}
if(scoreError != null) {
mv.addObject("scoreError", scoreError.getDefaultMessage());
}
if(phoneNumberError != null) {
mv.addObject("phoneNumberError", phoneNumberError.getDefaultMessage());
}
mv.setViewName("/index.jsp");
return mv;
}
mv.addObject("person", person);
mv.setViewName("/WEB-INF/jsp/hello.jsp");
return mv; } }

  BindingResult 接口中常用的方法有:

  getAllErrors():获取到所有的异常信息。其返回值为List,若没有发生异常,则该List也被创建,

  只不过其size()为0,而非List为null

  getFieldError():获取指定属性的异常信息

  getErrorCount(): 获取所有异常的数量

  getRawFieldValue():获取到用户输入的引发验证异常的原始值

  

  4.页面显示异常信息

 <form action="${pageContext.request.contextPath }/test/validator.do" method="post">
name :<input name="name" type="text"/> ${nameError }<br/>
score : <input name="score" type="text"/>${scoreError }<br/>
phoneNumber: <input name="phoneNumber" type="text"/>${phoneNumberError }<br/>
<input type="submit" value="提交"/>
</form>

  

15.SpringMVC核心技术-数据验证的更多相关文章

  1. SpringMVC学习笔记七:SpringMVC的数据验证

    SpringMVC支持JSR(Java Specification Requests, Java规范提案)303-Bean Validation数据验证规范,该规范的实现者很多,其中较常用的是 Hib ...

  2. SpringMVC配置数据验证(JSR-303)

    这篇文章已经过时了. 请参考比较合适的前后端交互方式. 1.pom.xml中追加hibernate-validator 2.在dto类的域上追加JSR-303的注解 public class Data ...

  3. springmvc 整合数据验证框架 jsr

    1.maven <dependency> <groupId>javax.validation</groupId> <artifactId>validat ...

  4. springMVC数据验证出现404错误解决办法

    今天使用springMVC的数据验证的时候,看似很简单的东西,却有一个很大的陷阱:提交空表单的时候总是出现404错误,但是后台却不给你报任何错.遇到这个错误这个很苦恼,搞了几小时,今天记录并分享一下解 ...

  5. SpringMVC数据验证

    SpringMVC数据验证——第七章 注解式控制器的数据验证.类型转换及格式化——跟着开涛学SpringMVC 资源来自:http://jinnianshilongnian.iteye.com/blo ...

  6. SpringMVC数据验证(AOP处理Errors和方法验证)

    什么是JSR303? JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案. Hibernate Validator 是 Bean Valida ...

  7. springmvc 数据验证 hibernate-validator --->对象验证

    数据验证步骤: 1.测试环境的搭建: 2.验证器的注册 在springmvc.xml配置文件中加以下代码: 3.验证注解添加到对应实体类上 4.修改处理器 5.将验证失败信息写入到表单 index.j ...

  8. SpringMVC使用@Valid注解进行数据验证

    SpringMVC使用@Valid注解进行数据验证   from:https://blog.csdn.net/zknxx/article/details/52426771 我们在做Form表单提交的时 ...

  9. SpringMVC(6)数据验证

    在系列SpringMVC(4)数据绑定-1.SpringMVC(5)数据绑定-2中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容 -> 数据验证. ...

随机推荐

  1. 16Flutter中的路由 基本路由 基本路由跳转传值(上)

    /* Flutter中的普通路由.普通路由传值.命名路由.命名路由传值 Flutter中的路由通俗的讲就是页面跳转.在Flutter中通过Navigator组件管理路由导航. 并提供了管理堆栈的方法. ...

  2. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_11-webpack研究-npm和cnpm安装配置

    node.js安装完成后,就自动安装了webpack. npm -v:查看npm安装的版本 当前安装目录默认的包 在node.js的目录下创建两个文件夹 这样路径就被修改成功了 cnpm npm in ...

  3. Docker save and load,镜像保存

    一.起因 docker pull 时发生错误 error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/r ...

  4. php-fpm 优化

    /usr/local/php/etc/php-fpm.conf 优化 [global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /us ...

  5. ubuntu kylin 18.04 安装 Qt Creator 5.11

    首先,去官网(https://download.qt.io/official_releases/qt/ )下载Qt Creator的安装包. 我下载的是5.11.1版本文件:qt-opensource ...

  6. 【c++基础】二进制格式输出char类型

    前言 使用CAN通信时将信号转换为char类型进行传输,要查看传输的信息是否正确需要将char类型数据以二进制格式输出: code #include <iostream> int main ...

  7. iOS——plist的创建,数据写入与读取

    iOS中plist的创建,数据写入与读取 Documents:应用将数据存储在Documents中,但基于NSuserDefaults的首选项设置除外Library:基于NSUserDefaults的 ...

  8. Ubuntu 14.04安装vim8

    本文介绍两种方法安装 VIM8.1 方法一:GitHub下载源码手动安装 1.查看系统是否有安装vim:如果有,先删除 dpkg -l | grep vim 2.从git上下载 git clone h ...

  9. 设计模式七大原则(C++描述)

    前言 最近在学习一些基本的设计模式,发现很多博客都是写了六个原则,但我认为有7个原则,并且我认为在编码中思想还是挺重要,所以写下一篇博客来总结下 之后有机会会写下一些设计模式的博客(咕咕咕...... ...

  10. spring boot中Elasticsearch默认版本问题

    这是今天遇上的一个问题. 添加的依赖是7.2.0版本的Elasticsearch,但是其中有两项是6.4.3的,导致我从其他地方移植过来的代码报错. 据大神说,这是因为spring boot中默认的E ...