好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

使用BindingResult 自定义错误信息

BindingResult 自定义错误信息

前提概要

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

基础框架

MVC:Spring MVC 3 视图:FreeMarker 验证:Hibernate-validator实现

配置文件和Java代码的修改

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

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

?

1

< mvc:annotation-driven />

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

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

?

1

2

3

4

5

6

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自定义标签。

?

1

2

3

4

5

6

7

8

9

10

11

12

@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中。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

@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的自定义标签库

?

1

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

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

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

?

1

2

3

<form:form commandName= "userDetail" >

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

</form:form>

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

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

?

1

2

3

4

<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

?

1

2

3

4

5

6

7

8

9

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

}

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

原文链接:https://blog.csdn.net/zhengun/article/details/84918567

查看更多关于使用BindingResult 自定义错误信息的详细内容...

  阅读:17次