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注解


目录
打赏
0
0
0
0
4
分享
相关文章
|
4月前
|
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
78 4
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
37 7
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
101 6
Spring Boot 入门:简化 Java Web 开发的强大工具
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
166 0
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
88 7
架构模式的诗与远方:如何在MVC的田野上,用Struts 2编织Web开发的新篇章
【8月更文挑战第31天】架构模式是软件开发的核心概念,MVC(Model-View-Controller)通过清晰的分层和职责分离,成为广泛采用的模式。随着业务需求的复杂化,Struts 2框架应运而生,继承MVC优点并引入更多功能。本文探讨从MVC到Struts 2的演进,强调架构模式的重要性。MVC将应用程序分为模型、视图和控制器三部分,提高模块化和可维护性。
59 0
Struts 2遇见Spring:这个组合如何颠覆你的Web开发?
【8月更文挑战第31天】在现代Web开发中,Struts 2与Spring的结合使用能显著增强应用的模块化和可维护性。本文将介绍如何整合这两个框架,并提供代码示例。首先,在`pom.xml`中添加Struts 2和Spring的依赖,然后在`struts.xml`中配置Struts 2以识别Spring插件。接着,在Spring配置文件中定义bean,并在Struts 2的Action类中使用`@Autowired`注解进行自动注入。
98 0
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
122 0
|
6月前
|
🔥JSF 与 Spring 强强联手:打造高效、灵活的 Web 应用新标杆!💪 你还不知道吗?
【8月更文挑战第31天】JavaServer Faces(JSF)与 Spring 框架是常用的 Java Web 技术。本文介绍如何整合两者,发挥各自优势,构建高效灵活的 Web 应用。首先通过 `web.xml` 和 `ContextLoaderListener` 配置 Spring 上下文,在 `applicationContext.xml` 定义 Bean。接着使用 `@Autowired` 将 Spring 管理的 Bean 注入到 JSF 管理的 Bean 中。
94 0

热门文章

最新文章

  • 1
    Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
    22
  • 2
    AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
    19
  • 3
    【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
    53
  • 4
    部署使用 CHAT-NEXT-WEB 基于 Deepseek
    279
  • 5
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 6
    java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
    37
  • 7
    零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
    27
  • 8
    【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
    20
  • 9
    FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
    53
  • 10
    springSecurity学习之springSecurity过滤web请求
    59