Spring 全家桶之 Spring Web MVC(五)- Data Binder(上)

简介: Spring 全家桶之 Spring Web MVC(五)- Data Binder

一、Spring MVC 工程搭建

  1. 创建Maven项目,添加Spring MVC依赖
  2. 添加Web Application
  3. 配置web.xml
  4. 配置Spring MVC配置文件dispatcher-servlet.xml
  5. 新建controller,增加HelloController,增加hello方法,返回page/success.jsp页面
  6. 在WEB-INF下创建pages目录,该目录下新增加success.jsp
  7. 打开Artifact,新建lib包,将依赖全部导入lib包下
  8. 配置tomcat,启动Tomcat,输入localhost:8080/hello,成功返回success.jsp页面

二、Spring MVC 中数据绑定

Spring MVC会将页面请求的数据转换成自定义的类型,如将页面提交的POST表单数据"employeeName=stark&age=40&gender=1&email=stark@gmail.com"转换成Employee对象。

Spring MVC将自定义对象和页面请求绑定时主要涉及以下操作:

  • 数据类型转换,页面提交的都是字符串,要将字符串转换成自定义对象的不同类型的属性
  • 格式化问题,如日期格式的转换等
  • 数据校验,对页面提交的数据进行校验

Debug新增员工时,员工的email是如何赋值给Employee对象的

image.png

// 将页面提交的数据封装到Java Bean中
bindRequestParameters(binder, request);
复制代码

封装的过程中发生了数据转换、格式化和校验的操作

image.png

WebDataBinder:既数据绑定器,负责数据绑定工作,涉及了类型转换、格式化、数据校验等

  • conversionService组件:负责数据类型转换以及格式化
  • validators组件:负责数据校验
  • bindingResult组件:负责保存解析数据绑定期间数据校验产生的错误

Spring MVC数据绑定流程 Spring MVC通过反射机制对目标方法进行解析,将请求数据绑定到处理方法的入参中,数据绑定的核心是DataBinder。

image.png

三、自定义类型转换器

ConversionService组件负责数据转换和格式化,ConversionService中有非常多的converter转换器,可以将页面提交的String类型数据转换成各种类型的数据,也可以通过实现Converter接口自定义类型转换器。

将spring-mvc-crud工程复制并重命名为spring-mvc-data;在list页面增加添加员工表单,向后台quickadd方法提交”empAdmin-admin@qq.com-1-101“这种类型的数据

<form action="/quickadd">
    <%--将员工信息都填上,自动封装对象--%>
    <input name="empinfo" value="empAdmin-admin@qq.com-1-101">
    <input type="submit" value="快速添加">
</form>
复制代码

Controller方法中增加quickAdd方法

@RequestMapping("/quickadd")
public String quickAdd(@RequestParam("empinfo") Employee employee){
    // 输出的封装对象为null
    System.out.println("封装的对象:"+ employee);
    return "redirect:/emps";
}
复制代码

重启Tomcat,在list页面执行快速添加操作

image.png

点击快速添加,页面报错Spring MVC无法将一段字符串“empAdmin-admin@qq.com-1-101”转换为Employee,这就需要自定义一个类型转换器,将String转换为Employee

Spring定义了3种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactoryBean中:

  • Converter<S,T>:将S类型转换为T类型
  • ConverterFactory:将相同系列多个同质Converter封装在一起,如果希望将一种类型的对象转换为另一种类型及其子类的对象可使用该转换器工厂类
  • GenericConverter:会根据源类对象及目标类对象所在的宿主类中上下文信息进行类型转换

3-1 实现自定义类型转换器

新建converter包,增加String转换为Employee的转换器类StringToEmployeeConverter

public class StringToEmployeeConverter implements Converter<String, Employee> {
    @Autowired
    private DepartmentDao departmentDao;
    @Override
    public Employee convert(String source) {
        System.out.println("将提交的String类型转换为Employee类型");
        if (!source.contains("-")){
            return null;
        }
        String[] empInfo = source.split("-");
        Employee employee = new Employee();
        employee.setLastName(empInfo[0]);
        employee.setEmail(empInfo[1]);
        employee.setGender(Integer.parseInt(empInfo[2]));
        Department department = departmentDao.getDepartment(Integer.parseInt(empInfo[3]));
        employee.setDepartment(department);
        return employee;
    }
}
复制代码

通过实现Converter接口实现转换,接口的泛型分别为源数据类型和目标数据类型,convert方法返回要转换的类,通过将String类型拆分并赋值给新建的一个Employee对象实现String到Employee的转换。

注册自定义的转换器

<mvc:annotation-driven conversion-service="conversionServiceFactory"></mvc:annotation-driven>
<!--使用自定义的ConverterService-->
<bean id="conversionServiceFactory" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <!--将自定义的转换器加入到converters中-->
    <property name="converters">
        <set>
            <bean class="com.citi.converter.StringToEmployeeConverter"></bean>
        </set>
    </property>
</bean>
复制代码

完成EmployeeController中的quickAdd方法

@RequestMapping("/quickadd")
public String quickAdd(@RequestParam("empinfo") Employee employee){
    // 输出的封装对象为null
    System.out.println("封装的对象:"+ employee);
    employeeDao.save(employee);
    return "redirect:/emps";
}
复制代码

重启Tomcat,执行添加操作

image.png

自定义转换器步骤

  1. 实现Converter接口,实现convert方法
  2. 将自定义的Converter配置在ConversionService中
  3. 注册添加了自定义Converter的ConversionService

3-2 mvn:annotation-driven 标签

mvn:annotation-driver 标签支持以下这些功能:

  • 自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter及ExceptionHandlerExceptionResolver三个组件
  • 支持ConversionService实例对表单参数进行类型转换
  • 支持@NumberFormat、@DataTimeFormat注解完成数据类型格式化
  • 支持@Valid注解对Bean进行数据校验
  • 支持@RequstBody和@ResponseBody注解


相关文章
|
1月前
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
130 4
|
2月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
104 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
2月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
123 0
|
2月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
86 0
|
2月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
94 0
|
2月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
96 0
|
1月前
|
SQL Java 编译器
深入理解 Spring Data JPA 的导入与使用:以 UserRepository为例
本文深入解析了 Spring Data JPA 中 `UserRepository` 的导入与使用。通过示例代码,详细说明了为何需要导入 `User` 实体类、`JpaRepository` 接口及 `@Repository` 注解。这些导入语句分别用于定义操作实体、提供数据库交互方法和标识数据访问组件。文章还探讨了未导入时的编译问题,并展示了实际应用场景,如用户保存、查询与删除操作。合理使用导入语句,可让代码更简洁高效,充分发挥 Spring Data JPA 的优势。
83 0
|
7月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
112 4
|
4月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
210 29
|
3月前
|
消息中间件 Java Kafka
【Azure Kafka】使用Spring Cloud Stream Binder Kafka 发送并接收 Event Hub 消息及解决并发报错
reactor.core.publisher.Sinks$EmissionException: Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially.

热门文章

最新文章