Spring MVC:验证器和@InitBinder

很难想象没有针对用户数据的验证逻辑的Web应用程序。 几乎所有用户的数据都有一些限制,例如,出生日期应由日,月,年等组成。SpringMVC拥有自己的数据验证解决方案,并且在Validator界面的帮助下可用。 Spring-MVC验证

Spring MVC Validator的用法

当您从用户那里收到某种数据时,及时进行验证是有意义的。 一种明显的方法是使用Web表单。 Validator接口是一种实现整个Spring MVC应用程序验证逻辑的方法。 听起来很有前途。

要开始使用Validator,需要做三件事:

  • 为某些域模型创建一个验证器类,并实现Validator接口。
  • 重载support(Class clazz)方法。
  • 重载validate(Object target,Errors errors)方法。

现在,您已经知道Validator接口用法的基础知识。 理论够了,让我们继续实践。

Vlidator Spring MVC示例

我想在先前的教程之一中演示Validator接口的实际作用,其中的验证不会多余。 我的意思是带有Spring Data的示例应用程序。 首先,您需要更新pom.xml文件,添加以下依赖项:

...<dependency><groupid>javax.validation</groupid><artifactid>validation-api</artifactid><version>1.0.0.GA</version></dependency><dependency><groupid>org.hibernate</groupid><artifactid>hibernate-validator</artifactid><version>4.3.0.Final</version></dependency>
...

在项目中,我有一个POJO:

@Entity  @Table(name = "shops")  public class Shop {  @Id  @GeneratedValue  private Integer id;  private String name;  @Column(name = "employees_number")  private Integer emplNumber;  public Integer getId() {  return id;  }  public void setId(Integer id) {  this.id = id;  }  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  public Integer getEmplNumber() {  return emplNumber;  }  public void setEmplNumber(Integer emplNumber) {  this.emplNumber = emplNumber;  }  }

因此,让我们为其创建验证规则:

  • “名称”不能为空。
  • “ emplNumber”不能为空。
  • “ emplNumber”不能小于1。

用于这些目的的验证类如下所示:

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;import com.spr.model.Shop;@Component
public class ShopValidator implements Validator {private final static String EMPLOYEES_NUMBER = "emplNumber";@Overridepublic boolean supports(Class clazz) {return Shop.class.isAssignableFrom(clazz);}@Overridepublic void validate(Object target, Errors errors) {Shop shop = (Shop) target;Integer emplNumber = shop.getEmplNumber();ValidationUtils.rejectIfEmpty(errors, "name", "shop.name.empty");ValidationUtils.rejectIfEmpty(errors, EMPLOYEES_NUMBER, "shop.emplNumber.empty");if (emplNumber != null && emplNumber < 1)errors.rejectValue(EMPLOYEES_NUMBER, "shop.emplNumber.lessThenOne");}}

注意,我将@Component注释应用于该类,因为我计划稍后将其注入ShopController。 这是验证器方法的说明:

support(Class)–此验证程序可以验证提供的Class的实例吗? validate(Object,org.springframework.validation.Errors)–验证给定的对象,并在验证错误的情况下,使用给定的Errors对象注册那些对象。 有关更多信息,请参见ValidationUtils类的javadoc。 验证期间将显示的消息应放在“ messages.properties”文件中:

shop.name.empty = The "Shop name" field can't be empty.
shop.emplNumber.empty = The "Employees number" field can't be empty.
shop.emplNumber.lessThenOne = The number of employees can't be less then 1.

让我们转到控制器的代码:

...@Autowiredprivate ShopValidator shopValidator;@InitBinderprivate void initBinder(WebDataBinder binder) {binder.setValidator(shopValidator);}
...@RequestMapping(value="/create", method=RequestMethod.POST)public ModelAndView createNewShop(@ModelAttribute @Valid Shop shop,BindingResult result,final RedirectAttributes redirectAttributes) {if (result.hasErrors())return new ModelAndView("shop-new");ModelAndView mav = new ModelAndView();String message = "New shop "+shop.getName()+" was successfully created.";shopService.create(shop);mav.setViewName("redirect:/index.html");redirectAttributes.addFlashAttribute("message", message);	return mav;		}
...

上面的代码片段演示了在控制器层中需要执行的主要操作,以实现验证:

  • 验证器的自动装配。
  • 将验证器添加到InitBinder
  • @Valid注释应用于具体控制器中的模型。

最后,让我们看一下JSP:

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
...
<h1>New Shop page</h1>
<form:form method="POST" commandname="shop" action="${pageContext.request.contextPath}/shop/create.html">
<table>
<tbody>
<tr>
<td>Shop name:</td>
<td><form:input path="name"></form:input></td>
<td><form:errors path="name" cssstyle="color: red;"></form:errors></td>
</tr>
<tr>
<td>Employees number:</td>
<td><form:input path="emplNumber"></form:input></td>
<td><form:errors path="emplNumber" cssstyle="color: red;"></form:errors></td>
</tr>
<tr>
<td><input value="Create" type="submit"></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</form:form>
...

请注意form:errors标记,它们负责显示错误消息。

Spring-MVC-Validator

摘要

Validator接口允许为应用程序中的每个域模型对象创建灵活的验证层。 它是标准JSR-303验证批注(例如@ Min,@ Max,@ NotNull,@ Size等)的不错选择。您可以在GitHub上找到示例的完整版本。

参考: Spring MVC:来自Fruzenshtein的便笺博客的JCG合作伙伴 Alexey Zvolinskiy的Validator和@InitBinder 。

翻译自: https://www.javacodegeeks.com/2013/06/spring-mvc-validator-and-initbinder.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADB 调试

1、adb简介 adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序&#xff0c;说白了就是debug工具。adb的工作方式比较特殊&#xff0c;采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯&#xff…

python 函数式编程尾递归优化 day16

函数编程的特征&#xff1a; 1不可变&#xff1a;不用变量保存状态&#xff0c;不修改变量 #非函数式 a 1 def incr_test1():global a#一旦更改全局变量后后面再调用a就容易乱a 1return a incr_test1() print(a) def bar():print(from bar) def foo():print(from foo)return …

java英文试题_Java试题及答案英文版

1&#xff0e;Which two demonstrate an “is a” relationship? (Choose Two)A. public interface Person { }public class Employee extends Person { }B. public interface Shape { }public class Employee extends Sha pe { }C. public interface Color { }public class E…

margin折叠-从子元素margin-top影响父元素引出的问题

正在做一个手机端电商项目&#xff0c;顶部导航栈的布局是一个div包含一个子div&#xff0c;如果给在正常文档流中的子div一个垂直margin-top&#xff0c;神奇的现象出现了&#xff0c;两父子元素的边距没变&#xff0c;但父div跟着一起往下走了&#xff01; html代码&#xff…

js时间转换

window.οnlοadfunction(){setInterval("mytime()",1000); } function mytime(){document.getElementById("time").innerHTML fmtDate(new Date()); } function fmtDate(obj){var date new Date(obj);var y 1900date.getYear();var m "0"(…

Lambdas:来到您附近的Java 8!

什么是Lambda&#xff1f; Lambda表达式是一种匿名函数&#xff0c;可以在方法中内联编写&#xff0c;并且可以在使用表达式的任何地方使用。 有时您可能会发现它们被称为闭包&#xff0c;尽管我在下面解释了对该参考的一些注意事项。 像普通的Java方法一样&#xff0c;它具有参…

CPU-内存-IO-网络调优

一、关于CPU 中央处理器调优 1、 CPU处理方式&#xff1a; 批处理&#xff0c;顺序处理请求。(切换次数少&#xff0c;吞吐量大)分时处理。(如同"独占"&#xff0c;吞吐量小)(时间片&#xff0c;把请求分为一个一个的时间片&#xff0c;一片一片的分给CPU处理)我们现…

spark抽取mysql数据到hive_使用spark将内存中的数据写入到hive表中

使用spark将内存中的数据写入到hive表中hive-site.xmlhive.metastore.uristhrift://master:9083Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.javax.jdo.option.ConnectionURLjdbc:mysql://master:3306/metastore?createDa…

使用Merge存储引擎实现MySQL分表

使用Merge存储引擎实现MySQL分表 学习了&#xff1a;https://www.cnblogs.com/try-better-tomorrow/p/4987620.html https://www.cnblogs.com/xbq8080/p/6628034.html http://blog.csdn.net/java_bruce/article/details/71077985 https://www.cnblogs.com/johnnyzhang/articles…

Flexible 弹性盒子模型之CSS flex-shrink 属性

实例 让第二个元素收缩到其他元素的三分之一&#xff1a; 效果预览 div:nth-of-type(2){flex-shrink:3;}浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一个版本。 属性 flex-shrink29.021.…

使用Base64

为什么要使用Base64&#xff1f;在设计这个编码的时候&#xff0c;我想设计人员最主要考虑了3个问题&#xff1a; 1.是否加密&#xff1f; 2.加密算法复杂程度和效率 3.如何处理传输&#xff1f; 加密是肯定的&#xff0c;但是加密的目的不是让用户发送非常安全的Email。这…

idea 新建的java项目没发run_IntelliJ IDEA创建普通的Java 项目及创建 Java 文件并运行的教程...

最近突然看到这篇几年前随手记录的文章&#xff0c;居然浏览量那么高。看来很多小伙伴也开始从 Eclipse 转到 IDEA&#xff0c;这里为了让大家更好的掌握 IDEA 的使用&#xff0c;我建议大家可以看看下面这个 IDEA 教程。首先&#xff0c;确保 IDEA 软件正确安装完成&#xff0…

如何在Maven中运行Ant目标?

maven-antrun-plugin允许我们在各种maven构建阶段中运行ant目标。 我将专门为具有开发环境的开发人员解释maven-antrun-plugin的非常实际的用法。 通常&#xff0c;使用maven build&#xff0c;您会将项目捆绑到war文件或ear文件中。 您可以使用maven-antrun-plugin直接将此w…

PHP基本知识

php为服务端的脚本语言&#xff0c;它的使用需要打开WAMP的开发环境&#xff0c;php也可以用制作网页的DW制作&#xff0c;文件需保存在wamp文件夹内的www文件夹里面。 嵌入php代码所使用的标签&#xff1a;<?php ?>&#xff1b; 运行php条件&#xff1a; 1.电脑上需…

java semaphore 等待_Java并发编程系列之Semaphore详解

简单介绍我们以饭店为例&#xff0c;假设饭店只有三个座位&#xff0c;一开始三个座位都是空的。这时如果同时来了三个客人&#xff0c;服务员人允许他们进去用餐&#xff0c;然后对外说暂无座位。后来的客人必须在门口等待&#xff0c;直到有客人离开。这时&#xff0c;如果有…

BZOJ1191: [HNOI2006]超级英雄Hero(二分图匹配)

Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5860 Solved: 2617[Submit][Status][Discuss]Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金。主持人问题准备了若干道题…

bzoj 2137: submultiple

Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 239 Solved: 113[Submit][Status][Discuss]Description 设函数g(N)表示N的约数个数。现在给出一个数M&#xff0c;求出所有M的约数x的g(x)的K次方和。 Input 第一行输入N&#xff0c;K。N表示M由前N小的素数组成。接下来N行&…

Java垃圾收集蒸馏

串行&#xff0c;并行&#xff0c;并发&#xff0c;CMS&#xff0c;G1&#xff0c;Young Gen&#xff0c;New Gen&#xff0c;Old Gen&#xff0c;Perm Gen&#xff0c;Eden&#xff0c;Tenured&#xff0c;Survivor Spaces&#xff0c;Safepoints和数百个JVM启动标志。 在尝试…

设计模式(二)模板方法模式

1.模版方法模式简介 模版方法模式介绍 在软件开发中&#xff0c;有时会遇到类似的情况&#xff0c;某个方法的实现需要多个步骤&#xff0c;其中有些步骤是固定的&#xff0c;而有些步骤并不固定&#xff0c;存在可变性。为了提高代码的复用性和系统的灵活性&#xff0c;可以…

命令行程序

1 package com.jdk7.chapter1;2 3 /**4 * 命令行程序5 * author celineluo6 *7 */8 public class CommandArgs {9 /** 10 * 调用系统错误方法打印错误信息 11 * 调用exit()关闭java虚拟机&#xff0c;0表示正常退出应用程序&#xff0c;其他值表示异常退出应…