SpringMVC——数据绑定和转换

一、数据绑定的大体流程
 •1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象
 •2. DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作,将 Servlet 中的请求信息填充到入参对象中
 •3. 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象
 •4. Spring MVC 抽取 BindingResult 中的入参对象和校验错误对象,将它们赋给处理方法的响应入参
 Spring MVC 通过反射机制对目标处理方法进行解析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是 DataBinder,运行机制如下图:
在这里插入图片描述
二、数据转换
 1、Spring MVC 上下文中内建了很多转换器,可完成大多数 Java 类型的转换工作
在这里插入图片描述
 2、自定义类型转换器
  ①说明
   a、ConversionService是Spring 类型转换体系的核心接口,可以利用 ConversionServiceFactoryBean在Spring的IOC容器中定义一个 ConversionService
   b、Spring将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及 SpringMVC 处理方法入参绑定等场合使用它进行数据的转换
   c、可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器
  ②自定义类型转换器:将字符串转化为Employee对象的转换器,实现Converter<String,Emloyee>接口,别忘了在转换器类上添加@Component注解

@Component
public class EmployeeConvert implements Converter<String,Employee>{
    @Override
    public Employee convert(String source){
        Employee result = null;
        if(null != source){
            String[] empInfos = source.split(";");
            if(null != empInfos && empInfos.length ==4){
                result = new Employee();
                
                result.setLastName(empInfos[0]);
                result.setEmail(empInfos[1]);
                result.setGender(Integer.parseInt(empInfos[2]));
                Department department = new Department();
                department.setId(Integer.parseInt(empInfos[3]));
                result.setDepartment(department);
            }
        }
        return result;
    }
}  

  ③配置

<bean id="conversionServiceFactoryBean" class="org.springframework.format.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <ref bean="employeeConvert" />
        </list>
    </property>
</bean>
<!-- 将自定义的 ConversionService 注册到 Spring MVC 的上下文中 -->  
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>   

 3、Spring支持的转换器
  Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactroyBean 中:
   1️⃣Converter<S,T>:将 S 类型对象转为 T 类型对象
   2️⃣ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类Integer、Long、Double 等对象)可使用该转换器工厂类
   3️⃣GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换

三、关于<mvc:annotation-driven />
 <mvc:annotation-driven />几乎是SpringMVC的标配,配置了<mvc:annotation-driven />后,会有以下作用:
 1️⃣会自动注册RequestMappingHandlerMapping 、RequestMappingHandlerAdapter 与 ExceptionHandlerExceptionResolver 三个bean
 2️⃣还将提供以下支持:
  支持使用 ConversionService 实例对表单参数进行类型转换
  支持使用 @NumberFormat 注解、@DateTimeFormat 注解完成数据类型的格式化
  支持使用 @Valid 注解对 JavaBean 实例进行 JSR 303 验证
  支持使用 @RequestBody 和 @ResponseBody 注解
在这里插入图片描述
Tip在想让处理器方法直接返回JSON串的时候必须有该配置,此时@RestController和@ResponseBody才会起作用

四、@InitBinder
 由 @InitBinder 标识的方法,可以对 WebDataBinder 对象进行初始化。WebDataBinder 是 DataBinder 的子类,用于完成由表单字段到 JavaBean 属性的绑定。使用是需要注意:
 1️⃣@InitBinder方法不能有返回值,它必须声明为void
 2️⃣@InitBinder方法的参数通常是是 WebDataBinder
在这里插入图片描述
五、自定义数据转换
 1、自定义转换器类:实现接口Converter<S,T>,别忘了将自定义的转换器类纳入到IOC容器

@Component
public class EmployeeConverter implements Converter<String, Employee> {
    @Override
    public Employee convert(String empStr) {
        Employee emp = null;
        if(empStr != null){
            String[] strs = empStr.split(",");
            if(strs.length == 3){
                emp = new Employee();
                emp.setName(strs[0]);
                emp.setEmail(strs[1]);
                emp.setAge(Integer.parseInt(strs[2]));
            }
        }
        return emp;
    }
}

 2、注册转换器:两种方式,别忘了在mvc:annotation-driven/标签中引用自定义的转换器

<bean id="factoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="com.atguigu.springmvc.converters.EmployeeConverter"/>
            <!-- <ref bean="employeeConverter"/> -->
        </list>
    </property>
</bean>
<mvc:annotation-driven conversion-service="factoryBean"/>  

 3、前台表单

<form action="${pageContext.request.contextPath }/testConvertor" method="post">
    <input type="text" name="employee" value="xiaowang,xw@qq.com,13"/>
    <input type="submit" value="提交"/>
</form>  

 4、后台处理方法:将前台employee请求参数用@RequestParam注解的方式获取,由于配置了自定义的转换器,在获取的时候会自动进行转换

@RequestMapping(value="/testConvertor",method=RequestMethod.POST)
public String testConvertor(@RequestParam("employee") Employee emp){
    System.out.println(emp);
    return "ok";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值