欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用BindingResult 自定义错误信息

程序员文章站 2022-03-12 14:49:13
目录bindingresult 自定义错误信息前提概要基础框架配置文件和java代码的修改在controller方法中指定需要进行校验进行自定义校验在jsp页面上显示校验错误信息bindingresu...

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");
}

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