使用BindingResult 自定义错误信息

 更新时间:2021-10-24 03:08:09   作者:佚名   我要评论(0)

目录BindingResult 自定义错误信息前提概要基础框架配置文件和Java代码的修改在Controller方法中指定需要进行校验进行自定义校验在JSP页面上

BindingResult 自定义错误信息

前提概要

在Spring MVC和FreeMarker整合的项目中,采用JSR-303验证框架,通过注解的方式进行数据验证

基础框架

MVC:Spring MVC 3

视图:FreeMarker

验证:Hibernate-validator实现

配置文件和Java代码的修改

在Spring MVC配置文件中添加配置

添加以下mvc的注解驱动配置,一切变成“自动化”

<mvc:annotation-driven />  

在JavaBean中添加数据校验的注解

其中@Length、@email就是Hibernate-validator中的数据校验注解,还可以用javax.validation中的注解,比如@NotNull

public class SystemUser {  
    @Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间")  
    private String userName;   
    @Email(message = "比如输入正确的邮箱")  
    private String email;  
}  

在Controller方法中指定需要进行校验

首先,要在需要进行校验的Bean前面加上@Valid注解,告诉SpringMVC框架这个Bean需要进行校验;

同时,还要在需要校验的Bean前面加上@modelattribute注解,从而将Bean暴露给视图,并且指定名字,这有两个作用,第一是显示校验错误需要使用这个名字,第二个是返回原来的页面以后,前面输入的所有值还要显示出来;

其次,每个需要校验的Bean后面紧跟一个BindingResult,SpringMVC框架会将校验结果保存在它里面,通过hasErrors方法可以判断是否有校验错误;

最后,当返回到原页面以后,SpringMVC框架还会将所有校验错误信息保存在上下文中,供页面上取得校验错误,Spring提供了一套JSP自定义标签。

@RequestMapping(value = "/create.html", method = RequestMethod.POST)  
public String doCreateUser(  
        @Valid @ModelAttribute("userDetail") SystemUser user,  
        BindingResult bindingResult,  
        HttpServletRequest request) {  
    // 如果有校验错误,返回添加用户的页面  
    if (bindingResult.hasErrors()) {  
        return "/user/create";  
    }        
    this.userService.createUser(user);  
    return "/user/list.html";  
}  

进行自定义校验

如果需要添加自定义校验,比如验证用户名是否已经被使用了,那么简单的注解自然无能为力,需要自己编码实现,如果校验失败,可以手动将自定义校验错误添加到BindingResult中。

@RequestMapping(value = "/user/create.html", method = RequestMethod.POST)  
public String doCreateUser(  
        @Valid @ModelAttribute("userDetail") SystemUser user,  
        BindingResult bindingResult,  
        HttpServletRequest request) {  
    // 如果有数据校验错误,返回添加用户的页面  
    if (bindingResult.hasErrors()) {  
        return "/user/create";  
    }    
    boolean isUserNameExist = this.userService.checkUserByUserName(user.getUserName());  
    // 如果用户名已存在,返回添加用户的页面  
    if (isUserNameExist) {  
        // 向BindingResult添加用户已存在的校验错误  
        bindingResult.rejectValue("userName", "该用户名已存在", "该用户名已存在");  
        return "/user/create";  
    }        
    this.userService.createUser(user);  
    return "/user/list.html";  
}

在JSP页面上显示校验错误信息

返回页面以后,SpringMVC框架将所有校验错误信息都放在了上下文中,可以自己去取出来,但是那样非常麻烦,不过没关系,Spring提供了一套自定义标签,可以方便的显示校验错误信息。

页面头部需要导入Spring的自定义标签库

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>  

需要一次性显示全部校验错误

(commandName的值就是@modelattribute注解中指定的值)

<form:form commandName="userDetail"> 
<form:errors path="*" cssStyle="color:red"></form:errors> 
</form:form> 

需要在对应输入框的后面显示单个校验错误

(通过path指定显示那个具体的校验错误,userDetail正是@modelattribute注解中指定的值,而点号后面则是指定显示Bean中哪个属性的校验错误)

<input type="text" name="userName" value="${userDetail.userName}" > 
<form:errors path="userDetail.userName" cssStyle="color:red"></form:errors> 
<input type="text" name="email" value="${userDetail.email}"> 
<form:errors path="userDetail.email" cssStyle="color:red"></form:errors> 

BindingResult错误返回显示失败

作为一个初学者经常犯低级错误,特别是没有老师的情况下。绊了一整天,不过找到原因了

如果redirect跳转回造成参数丢失

此时可以设置返回参数为Object

@RequestMapping(value = "/save", method = RequestMethod.POST)
public Object test(HttpServletRequest request, Model model, @Validated User user, BindingResult bindingResult)
throws Exception {
if (bindingResult.hasErrors()) {
return "user/save";
}
user.setVersion(0);
return new ModelAndView("redirect:/user/list");
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
  • JSR303校验注解和自定义校验注解的使用
  • SpringBoot如何优雅的处理校验参数的方法
  • SpringBoot后端进行数据校验JSR303的使用详解

相关文章

  • 使用BindingResult 自定义错误信息

    使用BindingResult 自定义错误信息

    目录BindingResult 自定义错误信息前提概要基础框架配置文件和Java代码的修改在Controller方法中指定需要进行校验进行自定义校验在JSP页面上
    2021-10-24
  • Java构造方法 super 及自定义异常throw合集详解用法

    Java构造方法 super 及自定义异常throw合集详解用法

    1.构造方法: public 类名(){} 区别一下 // public void 方法名(){} 分为有参,无参子类构造方法 public class Zi extends fu{ pu
    2021-10-24
  • 如何在SpringBoot+Freemarker中获取项目根目录

    如何在SpringBoot+Freemarker中获取项目根目录

    目录在Freemarker中获取项目根目录Freemark模板引擎路径的几种设置方法在SpringMVC中我们想返回视图是怎么做的在SpringBoot中springboot不推
    2021-10-24
  • Java面向对象之多态

    Java面向对象之多态

    目录一、前言二、什么是多态?三、多态的实现条件四、多态的访问特点1.我们建一个service包放Animal类2.再servic包下建一个impl包,包下放Ca
    2021-10-24
  • Java常用API类之Math System tostring用法详解

    Java常用API类之Math System tostring用法详解

    1.注意(类名不能与math重名,否则可能报错误) 1.math:可以直接拿来用的接口类 Math.abs(-90);返回参数的绝对值 Math.max(60,98)返回参数
    2021-10-24
  • Python干货实战之八音符酱小游戏全过程详解

    Python干货实战之八音符酱小游戏全过程详解

    目录导语&#127932;正文&#127932;&#127925;一、准备中1.1 游戏规则&#127926;1.2 素材图片&#127926;&#127925;二、环境2.1 小介绍&#127926;2.2
    2021-10-24
  • Java 面向对象之继承篇详解原理与特点

    Java 面向对象之继承篇详解原理与特点

    目录一、前言二、继承什么是继承呢?继承的好处与弊端继承的使用场景?继承的格式:继承的特点:重写的概念:super关键字super和this的比较一
    2021-10-24
  • 使用HTTPclient保持长连接

    使用HTTPclient保持长连接

    目录HTTPclient保持长连接首先解释一下什么是长连接如何在java中实现一个长连接呢httpclient因为保持永久长连接造成连接吊死的问题添加策略后
    2021-10-24
  • python 标准库原理与用法详解之os.path篇

    python 标准库原理与用法详解之os.path篇

    os中的path 查看源码会看到,在os.py中有这样几行 if 'posix' in _names: name = 'posix' linesep = '\n' from posix import
    2021-10-24
  • Java并发容器介绍

    Java并发容器介绍

    目录1、原子类2、锁3、并发容器4、List接口下5、Map接口下6、Set接口下7、Queue接口下Java并发包(concurrent)是Java用来处理并发问题的利器
    2021-10-24

最新评论