08.SpringMVC_数据绑定的流程
1.当我们提交表单,将表单中的数据绑定的⽅法的⼊参的对象中时,会涉及到数据绑定的流程,数据绑定的流程分为:数据类型转换、数据格式化、数据校验
2. 数据类型转换
SpringMVC默认为我们装配了以下类型转换器:
如果SpringMVC默认的类型转换器不能满⾜我们的需求,我们可以⾃定义类型转换器,如:将⼀个字符串转换为Employee对象创建⼀个类实现Converter<S,T>接⼝
public class MyConverter implements Converter<String, Employee> {
//  -1-101 这种格式的写法转换
@Override
public Employee convert(String arg0) {
Employee employee  = null;
if( arg0 != null){
String[] split = arg0.split( "-");
if( split != null && split. length == 4){
//获取姓名
String lastName = split[0];
//获取邮箱
String email = split[1];
//获取性别
int gender = Integer.parseInt( split[2]);
//获取部门的id
int deptId = Integer.parseInt( split[3]);
//创建Employee对象
employee  = new Employee();
employee.setLastName( lastName);
employee.setEmail( email);
employee.setGender( gender);
employee.setDepartment( new DepartmentDao().getDepartment( deptId));
}
}
return employee;
}
}
在SpringMVC配置⽂件中配置⾃定义的类型转换器
<!-- 配置类型转换器 -->
<bean id= "conversionService"class= "t.support.ConversionServiceFactoryBean"> <property name= "converters">
<set>
<bean class= "com.verter.MyConverter"></bean>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service= "conversionService"></mvc:annotation-driven>
这个必须写在<mvc:annotation-driven></mvc:annotation-driven>之前才⾏
// 测试⾃定义转换器
@RequestMapping(value = "/testMyConverter", method = RequestMethod. POST)
public String testMyConverter( @RequestParam( "employee") Employee employee) {
// 保存该员⼯
System. out.println( employee);
employeeDao.save( employee);
return"redirect:/getEmployees";
备注:
在Handler中通过 @InitBinder这个标签在数据绑定的过程不允许给某⼀个属性赋值
@InitBinder
public void initGender(WebDataBinder dataBinder){
//数据绑定的过程不允许给性别赋值
dataBinder.setDisallowedFields("gender");
}
@InitBinder⽅法不能有返回值,它必须声明为void。
@InitBinder⽅法的参数通常是 WebDataBinder
备注:
<mvc:annotation-driven/>配置在什么时候必须配置?
1. 直接配置响应的页⾯:⽆需经过控制器来执⾏结果 ;但会导致其他请求路径失效,需要配置mvc:annotation-driven标签<mvc:view-controller path="/success" view-
name="success"/>
2. 通过jQuery执⾏delete请求时,不到静态资源,需要配置mvc:annotation-driven标签
3. 配置类型转换器服务时,需要指定转换器服务引⽤<mvc:annotation-driven conversion-service=“conversionService”/> 会将⾃定义的ConversionService 注册到
Spring MVC 的上下⽂中
4. 数据验证,也需要配置
3.数据的格式化
我们可以通过@DateTimeFormat和@NumberFormat注解对应⽇期和数据进⾏格式化,只需要在要格式化的类的属性上添加以上注解即可
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
@NumberFormat(pattern= "#,###,###.##")
private double salary;
要使@DateTimeFormat和@NumberFormat注解起作⽤,必须配置<mvc:annotation-driven></mvc:annotation-driven>
<mvc:annotation-driven></mvc:annotation-driven>
配置,配置时不能指定conversion-service属性,否则,依然报错400。要把<mvc:annotation-driven conversion-service="conversionService"/>注掉才⾏
备注:
FormattingConversionService 实现类, 既具有类型转换的功能,⼜具有格式化的功能
<mvc:annotation-driven/> 默认创建的 ConversionService 实例即为
DefaultFormattingConversionService
4.数据校验
我们可以通过Hibernate Validator进⾏数据校验,使⽤它需要到导⼊以下jar包
classmate-0.8.0.jar
hibernate-validator-5.0.0.CR2.jar
hibernate-validator-annotation-processor-5.0.0.CR2.jar
jboss-logging-3.1.1.GA.jar
validation-api-1.1.0.CR1.jar
然后在要校验的属性上添加对应的注解
@NotEmpty
private String lastName;
@Email
private String email;
@Past
private Date birthday;
在要校验的属性对应的对象的前⾯添加@Valid注解,同时紧挨着该对象传⼊BindingResult类型的⼊参,通过它获取异常信息
// 添加新员⼯
@RequestMapping(value = "/emp", method = RequestMethod. POST)
public String addEmployee( @Valid Employee employee , BindingResult result) {
//BindingResult结果集对象必须紧挨着被校验的employee对象,中间不能有其他参数
//      System.out.println(employee);
int errorCount = ErrorCount();
if( errorCount > 0){
//证明有错误信息
List<FieldError> fieldErrors = FieldErrors();
springmvc常用标签for (FieldError fieldError : fieldErrors) {
//获取出现异常的属性
String field = Field();
//获取异常信息
String message = DefaultMessage();
System. out.println( field+ ":"+ message);
}
//转发到输⼊⽤户信息的页⾯
return"input";
}
// 保存⽤户
employeeDao.save( employee);
return"redirect:/emps";
}
要想当校验的注解起作⽤,必须配置<mvc:annotation-driven></mvc:annotation-driven>
<mvc:annotation-driven></mvc:annotation-driven>
通过<form:errors></form:errors>表单在前端页⾯显⽰错误信息
<!-- SpringMVC提供的表单默认表单中的数据是必须要回显的,默认情况下,SpringMVC会以command 作为key从request域中
查询模型数据,然后回显,不到则会抛出异常。我们可以通过form表单的modelAttribute属性来指定在request域中放的模型数据的key
-->
<form:form modelAttribute= "employee">
<!-- 如果path的值为通配符*,将显⽰所有的错误信息,如果要显⽰对应的错误信息,将该值设置为属性名即可-->
<%--        <form:errors path="*"></form:errors>--%>
<!-- path属性就相当于input中的name属性 -->
<!-- 当员⼯的id为null,即在添加新员⼯时再显⽰姓名 -->
<c:if test= "${ ployee.id } ">
姓名: <form:input path= "lastName"/><form:errors path= "lastName"></form:errors><br>
</c:if>
<!-- 对应更新来说,需要将POST请求转换为PUT请求,所以需要传⼀个请求参数_method -->
<c:if test= "${! ployee.id } ">
<form:hidden path= "id"/>
<input type= "hidden"name= "_method"value= "put">
</c:if>
邮箱: <form:input path= "email"/><form:errors path= "email"></form:errors><br>
性别: <form:radiobutton path= "gender"value= "1"label= "男"/>
<form:radiobutton path= "gender"value= "0"label= "⼥"/><br>
部门: <form:select path= "department.id"items= "${requestScope.depts } "itemValue= "id"itemLabel= "departmentName"></form:select> <br>
⽣⽇: <form:input path= "birthday"/><form:errors path= "birthday"></form:errors><br>
期望薪资: <form:input path= "salary"/><br>
<input type= "submit">
</form:form>
国际化错误信息
在SpringMVC的配置⽂件中配置国际化资源⽂件
<!-- 配置国际化资源⽂件 -->
<bean id= "messageSource"class= "t.support.ResourceBundleMessageSource">
<property name= "basename"value= "i18n"></property>
</bean>
国际化资源⽂件(i18n_zh_CN.properties)
\u4EB2\u7231\u7684\uFF0C\u4F60\u51FA\u751F\u7684\u65F6\u95F4\u8FD8\u6CA1\u5230\uFF0C\u5728\u4F60\u5988\u5988\u809A\u5B50\u91CC\u518D\u5446

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。