[Spring MVC] - InitBinder验证

Spring MVC使用InitBinder验证:

使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的,也即比较复杂的验证情况下才会使用。大部份简单的表单验证,使用annotation验证即可以解决。

Annotation验证使用方法可参见:http://www.cnblogs.com/HD/p/4123146.html

这里需要注意的一点:InitBinder和Annotation两种验证只能二选一,如果使用了InitBinder,就不能使用Annotation验证。

 

前面的web.xml和spring.xml的配置就不再重复,可参见上面链接中的配置。一模一样。

直接上代码:

 

1、User5 model实体类

package com.my.controller.bean;import java.util.Date;public class User5 {private long id;private String name;private String password;private Date createTime;private int age;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

 

2、新增一个Validator:

package com.my.controller.validator;import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;import com.my.controller.bean.User5;@Component
public class TestValidator implements Validator {@Overridepublic boolean supports(Class<?> paramClass) {return User5.class.equals(paramClass);}@Overridepublic void validate(Object obj, Errors errors) {User5 user = (User5) obj;ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "valid.name", null, "");if(user.getAge() < 18) {errors.rejectValue("age", "valid.ageMin", new Object[]{"age" ,18}, "年龄不能小于{1}岁");}}}

这里需要加入@Component,注入DI

 

3、Controller

package com.my.controller;import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;import javax.validation.Valid;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;import com.my.controller.bean.User5;@Controller
@RequestMapping(value="binder")
public class TestInitBinderController {@Autowired@Qualifier(value="testValidator")private Validator validator;@InitBinderprivate void initBinder(WebDataBinder binder) {binder.setValidator(validator);}@RequestMapping(method=RequestMethod.GET)public String index() {return "/TestInitBinder/index";}@RequestMapping(value="add", method=RequestMethod.POST)public ModelAndView add(@ModelAttribute @Valid User5 user, BindingResult result) {ModelAndView view = new ModelAndView("TestInitBinder/index");view.addObject("user", user);if(result.hasErrors()) {List<FieldError> errs = result.getFieldErrors();Map<String, String> mapErrors = new LinkedHashMap<String, String>();for(FieldError err : errs) {System.out.println("ObjectName:" + err.getObjectName() + "\tFieldName:" + err.getField()+ "\tFieldValue:" + err.getRejectedValue() + "\tMessage:" + err.getDefaultMessage());mapErrors.put(err.getField(), err.getDefaultMessage());view.addObject("errors", mapErrors);}return view;}return view;}}

把Validator注入到Controller中。

事实上,使用InitBinder,在add controller中的err.getDefaultMessage()方法是取不到对应正确的message的。可以看最后的输入打印结果。

 

4、View

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="st" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Init binder</title>
</head>
<body><form:form action="/TestSpringMvc1/binder/add" method="post" modelAttribute="user5">User name:<input type="text" id="name" name="name" value="${user.name}" /><br/>Password:<input type="text" id="password" name="password" value="${user.password}" /><br/>Age:<input type="text" id="age" name="age" value="${user.age}" /><br/><input type="submit" value="Add"/><hr/>Error:<br/><form:errors path="*"></form:errors></form:form>
</body>
</html>

注意,这里只能使用<form:errors />来取得错误信息,且,这个<form:errors/>一定要在<form:form/>当中。

 

5、结果测试

点击Add button:

 

打印输出:

可以看到,这里取不到错误的正确信息


 

 

事实上,在一个非常复杂表单页面,里头所提交的数据验证有一定的业务逻辑性时,InitBinder应该都不多用,因为很多时候我们可以使用一个Map,把errors插入进去,在页面读取即可。比如:

Map<String, String> errors;
errors.add("name", "user name can NOT be empty!");
:
:

页面中只需要使用:

<span style="color:red;">${errors.name}<span>

即可。

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

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

相关文章

linux6.5进入救援模式,rhel6.5救援模式修复系统

如果系统中很多重要的部分被删除了例如/boot下的所有东西&#xff0c;则可以通过救援模式[rootdazzle1 桌面]# mkdir /backup[rootdazzle1 桌面]# cp /etc/fstab /backup/fstab  //先备份以下fstab文件&#xff0c;也可以不备份自己写[rootdazzle1 桌面]# rm -rf /boot/*  …

一名毕业生的自述:我知道我必须写论文,但没聪明到可以写出来......

全世界只有3.14 % 的人关注了爆炸吧知识2020年转眼就到了4月。在即将毕业的学子之间&#xff0c;每天的狂野问候语是这样的&#xff1a;“你论文改完了吗&#xff1f;”“你论文查重率是多少&#xff1f;”“你什么时候答辩&#xff1f;”在微博上实时搜索“翟天临”三个字&…

不是架构的架构之四:业务层的实现与自动代理

我们在开篇中提到&#xff0c;希望能有一种办法&#xff0c;能自动适应系统的环境配置&#xff0c;在局域网小型应用中将直接访问数据库以获得最高的性能&#xff0c;在分布式环境中自动使用WCF来获得较好的安全性和连通性。 但是&#xff0c;我们不希望这样的特性使我们的开发…

python程序设计实践教程陈东_Python

“我们正步入一个数据或许比软件更重要的新时代。——Tim OReilly” 运用数据是精准刻画事物、呈现发展规律的主要手段&#xff0c;分析数据展示规律&#xff0c;把思想变得更精细&#xff01; 本课程面向各类编程学习者&#xff0c;讲解利用Python语言表达N维数据并结合数据特…

Silverlight中开发和设计人员的合作文档信息

-----------------------------------------------------------------------------------> copyright:http://www.docin.com/p-34191215.html转载于:https://www.cnblogs.com/molin/archive/2009/12/08/silverlight_manager.html

和男朋友一块儿吃VS单独一人在家吃饭

1 和男朋友一块儿吃VS单独一人在家吃饭2 忍不住要为这位跳高选手鼓掌了3 我们家的蔬菜就没有这种觉悟4 这螳螂拳算是练到家了5 现实中的你胖的一批 6 这套户型咋样&#xff1f;7 你能看出几个字你点的每个赞&#xff0c;我都认真当成了喜欢

指针04 - 零基础入门学习C语言44

第八章&#xff1a;指针04 让编程改变世界 Change the world by program 小结 归纳起来, 如果有一个实参数组, 想在函数中改变此数组中的元素的值, 实参与形参的对应关系有以下&#xff14;种情况&#xff1a; (1) 形参和实参都用数组名, 如&#xff1a; [codesyntax lang&…

填坑 | .NET 5在Docker中访问MSSQL报错

【.NET Core】| 作者 / Edison Zhou不知道你有没有在.NET Core/.NET 5的Docker访问MS SQL Server数据库&#xff0c;如果有&#xff0c;那么很有可能会遇到这个错误。1SSL版本错误最近在公司用.NET 5重构部分业务服务&#xff0c;由于之前老系统使用了MS SQL Server数据库&…

六个机械原理,动图形象直观、解读通俗易懂

全世界只有3.14 % 的人关注了爆炸吧知识01间歇运动机构▼间歇运动机构能够将原动件的连续转动转变为从动件周期性运动和停歇的机构&#xff0c;称为间歇运动机构。例如牛头刨床工作台的横向进给运动&#xff0c;电影放映机的送片运动等都用有间歇运动机构。常见的间歇运动机构有…

linux读写usb host,LINUX下USB1.1设备学习小记(3)_host与device

各位还记得”任何传输都是由host发起的”这句话么~在usb设备插入pc中到拔出usb设备,都是由host进行询问的一个usb鼠标的工作流程可以表达如下:usb鼠标插入pc中:主机询问设备:给我你的设备信息(控制传输)主机根据usb鼠标的设备信息进行驱动配置,配置结束后主机询问设备:给我你的…

java判断时间区间 隔天_Java初中级程序员面试题宝典

Java基础部分&与&&区别&#xff1f;&和&&都是逻辑运算符&#xff0c;都是判断两边同时真则为真&#xff0c;否则为假&#xff1b;但是&&当第一个条件不成之后&#xff0c;后面的条件都不执行了&#xff0c;而&则还是继续执行&#xff0c;直…

什么是sns

SNS 目录[隐藏] 第一章 什么是SNS&#xff1f; 第二章 SNS带给顾客的特殊价值描绘 第三章 观察SNS的技术与服务 第四章 SNS市场与竞争 第五章 SNS的主要营销策略简介 第六章 中国SNS的发展与主要网站及产品SNSSNS&#xff0c;全称Social Networking Services&#xff0c;即社会…

elsa-core——1.Hello World:Console

github上有一个开源的工作流项目elsa&#xff0c;elsa-core是core语言的版本&#xff0c;其文档因为是英文&#xff0c;因此会让很多人不想看&#xff0c;或者是看不下去&#xff0c;从这篇文章开始我将开始对elsa-core的文档翻译成中文并分享出来&#xff0c;方便大家查看与学…

docker 查看容器_Docker介绍

docker介绍什么是docker&#xff1f;我们先看一下官方文档对docker的定义。翻译一下就是&#xff1a;Docker是一个集开发&#xff0c;发布和运行应用程序的开放平台。Docker能够分离应用和基础架构&#xff0c;从而可以使得用户可以快速交付软件。借助于Docker&#xff0c;用户…

ASF经验谈(上)

http://software.intel.com/zh-cn/blogs/2009/12/01/asf/?cidsw:51cto【前言】写这篇文章之前先声明一下&#xff0c;笔者这里说到的ASF不是指Microsoft的多媒体文件的ASF格式&#xff08;可能这个很多人更熟悉一些&#xff09;&#xff0c;而是用于远程管理的ASF(Alert Stand…

ubuntu linux 批量部署,使用Cobbler批量部署Linux和Windows:CentOS/Ubuntu批量安装(二)...

通过前面服务端的部署&#xff0c;已经配置好了 Cobbler Server 端&#xff0c;接下来开始进行 CentOS/Ubuntu 的批量安装&#xff0c;在进行 CentOS/Ubuntu 批量安装时&#xff0c;也需要通过Cobbler来做相应的发行版导入配置。流程如下&#xff1a;上传ISO镜像到 Cobbler Ser…

盘点这些年被黑的最惨的语言

全世界只有3.14 % 的人关注了爆炸吧知识这些年&#xff0c;被黑过的语言数不胜数&#xff0c;最惨的要数HTML&#xff0c;但CSS、Python等也惨遭黑手比惨&#xff1f;这就来一波。HTMLHTMLC语言C语言JavaJavaJavaJavaJavaScript JavaScript JavaScriptJavaPHPPHPPHPPHPPythonPy…

2011目标 及 总结

20110918 添加 Glodon 任务规划 20110612 修改 经过年中分析&#xff0c;把下半年目标定为&#xff1a; 重心转向技术开发&#xff0c;有闲暇的时间就继续完成年初计划中的其它项。在技术学习方面&#xff0c;注意&#xff1a;不要花太多时间在开发“小系统”上&#xff0c;也不…

python 批量下载网页图片_Python实现多线程批量下载图片

《派森》(Python)3.13 win32 英文安装版 类型&#xff1a;编程工具大小&#xff1a;21M语言&#xff1a;英文 评分&#xff1a;8.7 标签&#xff1a; 立即下载 爬取图片可真的是一个可遇不可求的机会。 有需求就会动力。 目标&#xff1a;爬取某个网站上n多页的链接&#xff0c…

linux中获取redis的map,深入Redis之 bitmap位图和HyperLogLog(五)

bitmap位图我们知道一个字符占1个字节&#xff0c;也就是8个位例如set name bigbig字符串中的3个字符的ASCII码为98 105 113所以big转为二进制就是&#xff1a;01100010|01101001|01100111b i g占了3个字节的大小&#xff0c;一共24个位。bitmap位图可以帮我们获取…