Open hehongwei44 opened 7 years ago
在Spring MVC和FreeMarker整合的项目中,采用JSR-303验证框架,通过注解的方式进行数据验证
MVC:Spring MVC 3
视图:FreeMarker
验证:Hibernate-validator实现
添加以下mvc的注解驱动配置,一切变成“自动化”
<mvc:annotation-driven />
其中@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; }
首先,要在需要进行校验的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"; }
返回页面以后,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>
原文链接:http://yunzhu.iteye.com/blog/2088548
解决业务层方面的校验:需要自己编码实现,如果校验失败,可以手动将自定义校验错误添加到BindingResult中,BindingResult,BindingResult。重要的事情说3遍。
前提概要
在Spring MVC和FreeMarker整合的项目中,采用JSR-303验证框架,通过注解的方式进行数据验证
基础框架
MVC:Spring MVC 3
视图:FreeMarker
验证:Hibernate-validator实现
配置文件和Java代码的修改
在Spring MVC配置文件中添加配置
添加以下mvc的注解驱动配置,一切变成“自动化”
在JavaBean中添加数据校验的注解
其中@Length、@Email就是Hibernate-validator中的数据校验注解,还可以用javax.validation中的注解,比如@NotNull
在Controller方法中指定需要进行校验
首先,要在需要进行校验的Bean前面加上@Valid注解,告诉SpringMVC框架这个Bean需要进行校验;
同时,还要在需要校验的Bean前面加上@ModelAttribute注解,从而将Bean暴露给视图,并且指定名字,这有两个作用,第一是显示校验错误需要使用这个名字,第二个是返回原来的页面以后,前面输入的所有值还要显示出来;
其次,每个需要校验的Bean后面紧跟一个BindingResult,SpringMVC框架会将校验结果保存在它里面,通过hasErrors方法可以判断是否有校验错误;
最后,当返回到原页面以后,SpringMVC框架还会将所有校验错误信息保存在上下文中,供页面上取得校验错误,Spring提供了一套JSP自定义标签。
进行自定义校验
如果需要添加自定义校验,比如验证用户名是否已经被使用了,那么简单的注解自然无能为力,需要自己编码实现,如果校验失败,可以手动将自定义校验错误添加到BindingResult中。
在JSP页面上显示校验错误信息
返回页面以后,SpringMVC框架将所有校验错误信息都放在了上下文中,可以自己去取出来,但是那样非常麻烦,不过没关系,Spring提供了一套自定义标签,可以方便的显示校验错误信息。
页面头部需要导入Spring的自定义标签库
需要一次性显示全部校验错误 (commandName的值就是@ModelAttribute注解中指定的值)
需要在对应输入框的后面显示单个校验错误 (通过path指定显示那个具体的校验错误,userDetail正是@ModelAttribute注解中指定的值,而点号后面则是指定显示Bean中哪个属性的校验错误)