时间:2021-05-20
使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的,也即比较复杂的验证情况下才会使用。大部份简单的表单验证,使用annotation验证即可以解决。
Annotation验证使用方法可参见:
这里需要注意的一点:InitBinder和Annotation两种验证只能二选一,如果使用了InitBinder,就不能使用Annotation验证。
前面的web.xml和spring.xml的配置就不再重复,可参见上面链接中的配置。一模一样。
直接上代码:
1、User5 model实体类
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;@Componentpublic class TestValidator implements Validator { @Override public boolean supports(Class<?> paramClass) { return User5.class.equals(paramClass); } @Override public 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
把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>即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在spring3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAtt
Spring3MVC请求参数获取的几种方法一、通过@PathVariabl获取路径中的参数@RequestMapping(value="user/{id}/{n
在本教程中,我们将研究标准Spring框架和SpringBoot之间的区别。我们将重点讨论Spring的模块,如MVC和Security,在核心Spring中使
Spring4.0MVC请求json数据报406错误,如何解决?解决方法一:1、导入jackson-core-2.5.1.jar和jackson-databin
Spring框架七大模块简单介绍Spring中MVC模块代码详解ORM模块对Hibernate、JDO、TopLinkiBatis等ORM框架提供支持ORM模块