详解SpringMVC中的Errors和BindingResult数据验证

表单数据验证可以有效的过滤掉一些垃圾数据和一部分机器注册。Struts2中有完整的验证接口,SpringMVC中也同样的为我们提供了对应的验证机制。本文将详细的介绍SpringMVC中的数据验证Errors和BindingResult。

更多精彩内容请看 web前端中文站
www.lisa33xiaoq.net 可按Ctrl + D 进行收藏

数据验证

  • 数据绑定失败:比如需要数字却输入了字母;
  • 数据不合法:可以认为是业务错误,通过自定义验证器验证,如用户名长度必须在5-20之间,我们却输入了100个字符等;
  • 错误对象:当我们数据绑定失败或验证失败后,错误信息存放的对象,我们叫错误对象,在Spring Web MVC中Errors是具体的代表者;线程不安全对象;
  • 错误消息:是硬编码,还是可配置?实际工作应该使用配置方式,我们只是把错误码(errorCode)放入错误对象,在展示时读取相应的错误消息配置文件来获取要显示的错误消息(errorMessage);

验证流程

详解SpringMVC中的Errors和BindingResult数据验证

  • 首先进行数据绑定验证,如果验证失败会通过MessageCodesResolver生成错误码放入Errors错误对象;
  • 数据不合法验证,通过自定义的验证器验证,如果失败需要手动将错误码放入Errors错误对象;

错误对象和错误消息

错误对象的代表者是Errors接口,并且提供了几个实现者,在Spring Web MVC中我们使用的是如下实现:

详解SpringMVC中的Errors和BindingResult数据验证

  • getFieldValue:可以得到验证失败的失败值,这是其他Web层框架很少支持的,这样就可以给用户展示出错时的值(而不是空或其他的默认值等)。
  • BindingResult:代表数据绑定的结果,继承了Errors接口。
  • BindException:代表数据绑定的异常,它继承Exception,并实现了BindingResult,这是内部使用的错误对象。
  • Errors:存储和暴露关于数据绑定错误和验证错误相关信息的接口,提供了相关存储和获取错误消息的方法:
 package org.springframework.validation;   
 public interface Errors {    
 //全局错误消息(验证/绑定对象全局的)  
 //注册一个全局的错误码()    
 void reject(String errorCode);    
 //注册一个全局的错误码,当根据errorCode没有找到相应错误消息时,
 //使用defaultMessage作为错误消息    
 void reject(String errorCode, String defaultMessage);    
 //注册一个全局的错误码,当根据errorCode没有找到相应错误消息时(带错误参数的),
 //使用defaultMessage作为错误消息    
 void reject(String errorCode, Object[] errorArgs, String defaultMessage);    
 //全局错误消息(验证/绑定整个对象的)  
 //局部错误消息(验证/绑定对象字段的)  
 //注册一个对象字段的错误码,field指定验证失败的字段名    
 void rejectValue(String field, String errorCode);    
 void rejectValue(String field, String errorCode, String defaultMessage);    
 void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage);    
 //局部错误消息(验证/绑定对象字段的)  boolean hasErrors();      
 ////是否有错误    boolean hasGlobalErrors(); 
 //是否有全局错误    
 boolean hasFieldErrors();  
 //是否有字段错误    
 Object getFieldValue(String field); 
 //返回当前验证通过的值,或验证失败时失败的值;   
 }

控制器

 package com.lisa33xiaoq.net.chapter4.web.controller;   
 //省略import   
 public class ErrorController extends AbstractCommandController {    
 public ErrorController() {       
 setCommandClass(DataBinderTestModel.class);       
 setCommandName("command");    }    
 @Override    
 protected ModelAndView handle(HttpServletRequest req,    
 HttpServletResponse resp, Object command,    
 BindException errors) 
 throws Exception {          
 //表示用户名不为空       
 errors.reject("username.not.empty");       
 //带有默认错误消息       
 errors.reject("username.not.empty1", "用户名不能为空1");       
 //带有参数和默认错误消息               
 errors.reject("username.length.error", new Object[]{5, 10});       
 //得到错误相关的模型数据       
 Map model = errors.getModel();       
 return new ModelAndView("bindAndValidate/error", model);    }   }
  • errors.reject(“username.not.empty”):注册全局错误码“username.not.empty”,我们必须提供messageSource来提供错误码“username.not.empty”对应的错误信息(如果没有会抛出NoSuchMessageException异常);
  • errors.reject(“username.not.empty1”, “用户名不能为空1”):注册全局错误码“username.not.empty1”,如果从messageSource没没有找到错误码“username.not.empty1”对应的错误信息,则将显示默认消息“用户名不能为空1”;
  • errors.reject(“username.length.error”, new Object[]{5, 10}):错误码为“username.length.error”,而且错误信息需要两个参数,如我们在我们的配置文件中定义“用户名长度不合法,长度必须在{0}到{1}之间”,则实际的错误消息为“用户名长度不合法,长度必须在5到10之间”
  • errors.getModel():当有错误信息时,一定将errors.getModel()放入我们要返回的ModelAndView中,以便使用里边的错误对象来显示错误信息。

spring配置文件chapter4-servlet.xml

 <bean id="messageSource"          
 class="org.springframework.context.support.ReloadableResourceBundleMessageSource">       
 <property name="basename" value="classpath:messages"/>       
 <property name="fileEncodings" value="utf-8"/>       
 <property name="cacheSeconds" value="120"/>   
 </bean>   
 <bean name="/error" class="com.lisa33xiaoq.net.chapter4.web.controller.ErrorController"/>

messageSource:用于获取错误码对应的错误消息的,而且bean名字默认必须是messageSource。

messages.properties(需要执行NativeToAscii)

 username.not.empty=用户名不能为空   
 username.length.error=用户名长度不合法,长度必须在{0}到{1}之间

视图页面(WEB-INF/jsp/bindAndValidate/error.jsp)

 <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>   
 <!-- 表单的默认命令对象名为command -->   
 <form:form commandName="command">       
 <form:errors path="*"></form:errors>   
 </form:form>
  • form标签库:此处我们使用了spring的form标签库;
  • <form:form commandName=”command”>:表示我们的表单标签,commandName表示绑定的命令对象名字,默认为command;
  • <form:errors path=”*”></form:errors>:表示显示错误信息的标签,如果path为“*”表示显示所有错误信息。

接下来我们来看一下 数据绑定失败和数据不合法时,如何处理。

数据绑定失败

如我们的DataBinderTestModel类:

  • bool:boolean类型,此时如果我们前台传入非兼容的数据,则会数据绑定失败;
  • date:Date类型,此时如果我们前台传入非兼容的数据,同样会数据绑定失败;
  • phoneNumber:自定义的PhoneNumberModel类型,如果如果我们前台传入非兼容的数据,同样会数据绑定失败。

关于数据绑定失败的示例,我们下章见。本文示例源码下载链接:http://pan.baidu.com/s/1bpvohZp 密码:wgde

【注:本文源自网络文章资源,由站长整理发布】

0
如无特殊说明,文章均为原作者原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论

Hi,请填写昵称和邮箱!

取消评论
代码 贴图 加粗 链接 删除线 签到