SpringMVC数据绑定流程
A:SpingMVC 主框架将 ServletRequest 对象及目标方法的入参实例传递 WebDataBinderFactory 实例,以创建DataBinder 实例对象
B:DataBinder 调用装配在 SpringMVC 上下文中的ConversionService 组件进行 数据类型转换、数据格式工作,将Servlet 中的请求信息填充到入参对象中
C:调用Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象
D:SpringMVC 抽取 BindingResult 中的入参对象和校验错误对象,将他们赋给处理方法的响应入参
一、数据转换
1、加入jar包:joda-time-2.1.jar
2、实体使用,@DateTimeFormat(pattern="yyyy-MM-dd")和@NumberFormat(pattern="#,###,###.#")进行数据转换,其他注解下面数据验证是会说明
public class Employee {
private Integer id;
@NotEmpty
private String lastName;
@Email
private String email;
private int gender;
private Department department;
@Past
@DateTimeFormat(pattern="yyyy-MM")
private Date birth;
@NumberFormat(pattern="#,###,###.#")
private double num;
}
3、配置文件中配置 <mvc:annotation-driven ></mvc:annotation-driven>
4、Controller的使用
/**
* 数据转换测试方法
* @param map
* @return
*/
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test(Model model){
Employee employee = new Employee();
employee.setId(1);
employee.setBirth(new Date());
employee.setNum(100000d);
model.addAttribute("employee", employee);
return "test";
}
5、jsp,使用form标签
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<body>
<form:form action="emp" method="post" modelAttribute="employee">
Birth: <form:input path="birth"/>
<br/>
Num: <form:input path="num"/>
<br/>
<input type="submit" value="Submit"/>
</form:form>
</body>
6、结果:显示的数据会根据实体上@DateTimeFormat(pattern="yyyy-MM-dd")和@NumberFormat(pattern="#,###,###.#")格式显示数据
二、数据校验
1、如何进行数据验证
a:根据JSR 303进行验证:JSR 303 是Java 为Bean 数据合法性校验提供的标准框架,它已经包含在JavaEE6.0中了
b:Spring4.0 拥有自己独立的数据校验框架,同时支持JSR 303
c:在Spring 需要配置LocalValidatorFactoryBean(即配置<mvc:annotation-driven />)
2、需要 的jar包(hibernate validator 验证框架的jar包)
hibernate-validator-5.0.0.CR2.jar
hibernate-validator-annotation-processor-5.0.0.CR2.jar
3.、实体
使用还是使用上面数据转换的实体,使用@NotEmpty,@Email,@Past,@DateTimeFormat注解进行验证,其中验证的注解还有很多,感兴趣的可以百度一波,这边不做太多说明了
@NotEmpty 不为空,@Email验证邮箱,@Past验证时间是否比当前早,@DateTimeFormat验证时间格式
4、加上<mvc:annotation-driven />配置
5、jsp,使用form标签,验证不通过的错误信息使用form:errors进行输出
<form:form action="emp" method="post" modelAttribute="employee">
<form:errors path="*"></form:errors><br/>
<c:if test="${employee.id == null }">
LastName: <form:input path="lastName"/>
<form:errors path="lastName"></form:errors>
</c:if>
<c:if test="${employee.id != null }">
<form:hidden path="id"/>
<!-- 对于_method 不能使用form:hidden 标签,因为 modelAttribute 对应的bean 中没有_method 这个属性,会出错-->
<input type="hidden" name="_method" value="PUT"/>
</c:if>
<br/>
Email: <form:input path="email"/>
<form:errors path="email"></form:errors>
<br/>
Geder: <form:radiobuttons path="gender" items="${geders }" />
<br/>
Department: <form:select path="department.id" items="${depatrtments }" itemValue="id" itemLabel="departmentName"></form:select>
<br/>
Birth: <form:input path="birth"/>
<form:errors path="birth"></form:errors>
<br/>
Num: <form:input path="num"/>
<br/>
<input type="submit" value="Submit"/>
</form:form>
6、form提交的Controller,在目标bean 前加上@Valid 注解
@RequestMapping(value = "/emp", method = RequestMethod.POST)
public String save(@Valid Employee employee,BindingResult result, Map<String, Object> map){
//System.out.println(employee);
if(result.getErrorCount() > 0){
for(FieldError error : result.getFieldErrors()){
System.out.println(error.getCode()+ " : "+error.getDefaultMessage());
}
map.put("depatrtments", departmentDao.getAll());
return "input";
}
emploeeDao.save(employee);
return "redirect:/empList";
}
7、效果图
注:需校验的 Bean 对象和其绑定结果对象或错误对象成对出现的,他们之间不允许声明其他的入参
在使用JSR 303 框架时,有可能会与tomacat下的jar冲突,需要删除tomacat下的与el相关的包,然后加入JSR 303的与el相关的jar包