1、整合背景
项目中使用了SpringMVC整合FreeMarker作为页面渲染,在后台管理端页面存在大量的form输入项,每个输入项在提交到Controller层时都需要对数据的有效性进行校验,工作量非常大而且繁琐。
2、校验框架
为了解决数据校验的问题,调研了一下Hibernate-validator,发现该框架功能非常的全面,能很好的解决我遇到的数据校验问题,官方文档:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-gettingstarted-createproject
Hibernate-validator 的优势:
支持校验规则分组
支持国际化错误消息
支持错误的fail-fast模式:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-fail-fast
支持自定义校验注解
3、校验依赖包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.5.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
4、示例代码
UserDemoDO .java
import com.jd.jdpetrol.dao.enums.YNEnum;
import org.apache.ibatis.type.Alias;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Alias("UserDemoDO")
public class UserDemoDO {
@NotNull
private Long id;
@NotBlank
private String name;
private YNEnum yn;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public YNEnum getYn() {
return yn;
}
public void setYn(YNEnum yn) {
this.yn = yn;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("UserDemo{");
sb.append("id=").append(id);
sb.append(", name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}
public static void main(String[] args) {
String str = "/abc";
if (str.startsWith("/")) {
System.out.println(str.substring(1));
}
}
}
import java.util.HashMap;
import java.util.Map;
/**
* Created by XFrame on 2016/1/29.
*/
public enum YNEnum {
VALID(1, "有效"),
INVALID(0, "无效");
YNEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
private Integer code;
private String desc;
private static Map<Integer, YNEnum> map = new HashMap<Integer, YNEnum>();
static {
for (YNEnum ele : values()) {
map.put(ele.code, ele);
}
}
public static YNEnum getByCode(Integer code) {
return map.get(code);
}
public Integer getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
UserDemoController .java
@Controller
@RequestMapping("/demo")
public class UserDemoController {
@RequestMapping("/user2")
public String index(ModelMap model) {//UserDemoDO userVo
UserDemoDO userVo = new UserDemoDO();
model.addAttribute("userDemoDO", userVo);
return "userdemo/user2";
}
@RequestMapping(value = "/user", method = POST)
//@ResponseBody
public ModelAndView addUser(@Validated UserDemoDO user, BindingResult br) {
ModelAndView modelView = new ModelAndView();
modelView.setViewName("userdemo/user2");
//基础校验
if (br.hasErrors()) {
return modelView;
}
user.setYn(YNEnum.VALID);
//userDemoService.save(user);
return modelView;
}
}
5、FreeeMarker 页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>user demo</title>
<style>
.outer {
margin-top: 20px;
}
</style>
</head>
<body>
<#import "/spring.ftl" as spring/>
<div class="outer">
<form action="/demo/user/" name="user" method="post">
<@spring.bind "userDemoDO.id" />
用户Id:<input type="text" id="id" name="id"/> <br/>
<@spring.showErrors "<br>"/>
用户名:<input type="text" id="name" name="name"/> <br/>
<input type="submit" value="提交">
<br>
<#if userDemoDO??>
<@spring.bind "userDemoDO.id" />
<#--<@spring.showErrors "<br>"/>-->
<@spring.bind "userDemoDO.name" />
<#list spring.status.errorMessages as error> <b>${error}</b> <br> </#list>
<br>****************11****************<br>
<@spring.bind "userDemoDO.*" />
<@spring.showErrors "<br>"/>
</#if>
--------------------
<br>
<br>
=====================333========================
</form>
</div>
</body>
</html>
6、校验效果
7、解析错误信息的核心源代码
org.springframework.web.servlet.support.BindStatus
8、参考文章:
http://yunzhu.iteye.com/blog/2088548
http://hualong.iteye.com/blog/2038092
http://blog.csdn.net/fengyong7723131/article/details/54668905
PDF 文档下载:https://pan.baidu.com/s/1htA4BAG
有问题欢迎加qq:787141854 交流