【Java 高阶】一文精通 Spring MVC - 转换器(五)

在这里插入图片描述

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 高阶
🙉八股文专题:剑指大厂,手撕 Java 八股文

文章目录

      • 1. 什么是转换器
      • 2. 转换器的优缺点
      • 3. 转换器的应用场景
      • 4. 转换器的原理
      • 5. 内置转换器
      • 6. 自定义转换器

1. 什么是转换器

转换器是一种用于将一种数据类型转换为另一种数据类型的工具或组件。在编程中,数据类型的转换是常见的操作,例如将字符串转换为整数、将日期对象转换为字符串等。转换器提供了一种方便的方式来执行这些类型转换操作,使开发人员能够在不同的数据类型之间进行转换,并且可以根据需要进行自定义转换逻辑。

2. 转换器的优缺点

转换器的优缺点如下:
优点

  1. 灵活性:转换器提供了灵活的数据类型转换能力,可以将一种数据类型转换为另一种数据类型,满足不同的需求。
  2. 可扩展性:开发人员可以根据具体需求实现自定义转换器,以处理特定的数据类型转换场景。
  3. 代码重用:通过使用转换器,可以将常见的数据类型转换逻辑封装起来,使其可以在不同的地方重复使用,提高代码的重用性和可维护性。
  4. 数据校验:在进行数据类型转换时,转换器可以对数据进行校验,确保转换的准确性和有效性。

缺点

  1. 性能开销:转换器可能会引入额外的性能开销,特别是在处理大量数据或复杂转换逻辑时。
  2. 异常处理:转换器可能会抛出异常,需要进行适当的异常处理和错误处理。
  3. 转换规则管理:当有多个转换器存在时,需要管理和维护转换规则,确保正确的转换逻辑被应用。

3. 转换器的应用场景

转换器在软件开发中有很多应用场景,以下是一些常见的应用场景:

  1. 表单数据处理:当用户提交表单数据时,转换器可以将表单数据从字符串转换为目标数据类型,如整数、日期等,以便后续处理。
  2. 数据库操作:在与数据库进行交互时,转换器可以将数据库中的数据转换为应用程序所需的数据类型,或将应用程序中的数据转换为数据库所需的数据类型。
  3. 数据校验:转换器可以用于对输入数据进行校验和验证,确保数据的有效性和完整性。
  4. API调用:当与外部API进行交互时,转换器可以将数据转换为API所需的格式,或将API返回的数据转换为应用程序所需的格式。
  5. 数据序列化和反序列化:转换器可以将对象转换为字符串或字节流,以便在网络传输或持久化存储中使用,并将其反序列化为对象。
  6. 数据格式化和显示:转换器可以将数据格式化为特定的文本或显示格式,以便在用户界面上展示给用户。
  7. 数据转换和集成:在不同系统或组件之间进行数据交换时,转换器可以将数据从一个系统的格式转换为另一个系统的格式,实现数据的互操作性和集成。

这些只是转换器在软件开发中的一些常见应用场景,实际上转换器的应用范围非常广泛,可以根据具体需求和业务场景进行灵活应用。

4. 转换器的原理

转换器的原理是将一种数据类型转换为另一种数据类型的过程。转换器的实现通常涉及以下几个方面的原理:

  1. 数据类型识别:转换器需要能够识别原始数据的类型,以确定需要进行的转换操作。这可以通过检查数据的类型信息或使用特定的数据类型识别算法来实现。
  2. 转换逻辑:转换器需要根据源数据的类型和目标数据的类型,执行相应的转换逻辑。这可能涉及数据格式的解析、数值的计算、数据结构的转换等操作。
  3. 错误处理:转换器需要能够处理转换过程中可能出现的错误,例如数据格式不匹配、无效的数据等。适当的错误处理机制可以确保转换过程的稳定性和可靠性。
  4. 自定义转换规则:转换器通常允许开发人员定义自定义的转换规则,以满足特定的转换需求。这可以通过配置文件、注解或编程方式来实现。
  5. 性能优化:对于大规模数据转换或复杂转换逻辑,转换器的性能可能成为关键因素。因此,转换器的实现需要考虑性能优化策略,如缓存、并发处理等。

5. 内置转换器

在Spring MVC中,有一些内置的转换器用于处理请求参数的类型转换。以下是一些常见的Spring MVC内置转换器:

  1. String转换器:将请求参数直接转换为String类型。
  2. Integer、Long、Float、Double等基本类型转换器:将请求参数转换为相应的基本数据类型。
  3. Boolean转换器:将请求参数转换为Boolean类型。
  4. Date转换器:将请求参数转换为Date类型,支持多种日期格式。
  5. Enum转换器:将请求参数转换为枚举类型。
  6. 数组和集合转换器:将请求参数转换为数组或集合类型。
  7. 自定义对象转换器:可以通过实现Converter接口或使用注解来自定义对象的转换器。

这些内置转换器可以根据请求参数的类型自动进行类型转换,无需手动编写转换逻辑。如果需要自定义转换器,可以实现Converter接口或使用注解来指定转换规则。

6. 自定义转换器

在Spring MVC中,您可以自定义类型转换器来处理特定类型的请求参数转换。以下是一种常见的方法来实现自定义类型转换器:

  1. 创建一个实现了 Converter<S, T> 接口的转换器类,其中 S 是源类型, T 是目标类型。
import org.springframework.core.convert.converter.Converter;

public class CustomConverter implements Converter<String, CustomType> {
    
    @Override
    public CustomType convert(String source) {
        // 在这里实现从String到CustomType的转换逻辑
        // 返回转换后的CustomType对象
    }
}
  1. 在Spring配置文件(如XML配置文件或Java配置类)中注册自定义转换器。
<mvc:annotation-driven conversion-service="conversionService" />
 <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.example.CustomConverter" />
        </set>
    </property>
</bean>

或者使用Java配置类:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new CustomConverter());
    }
}
  1. 在控制器中使用自定义类型。
@RestController
public class MyController {
    
    @RequestMapping("/myEndpoint")
    public String handleRequest(@RequestParam("customParam") CustomType customType) {
        // 处理CustomType类型的请求参数
        return "resultPage";
    }
}

我们创建了一个自定义的转换器 CustomConverter ,将请求参数从String类型转换为 CustomType 类型。然后将转换器注册到Spring MVC中,以便在控制器中使用自定义类型。

精彩专栏推荐订阅:在下方专栏👇🏻
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring
✅ Java 初阶

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/87182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

table,设置 数据相同时, 合并列

<el-table :data"tableData" :span-method"objectSpanMethod" border style"width: 100%" show-summary><el-table-column type"index" label"序号" width"100" /><el-table-column prop"dat…

红日靶场(一)vulnstack1 渗透过程分析

文章目录 环境搭建信息收集PhpMyAdmin 后台 Getshellinto outfileMysql日志文件写入shell CS后渗透MSF后渗透知识补充nmap参数分类参数速查表 dirsearch 环境搭建 ip段设置 kali (coleak)&#xff1a;192.168.145.139 Windows 7 (stu1)&#xff1a;192.168.10.181、192.168.1…

Java后端:html转pdf实战笔记

1、htmltopdf有什么用? htmltopdf 是一款基于wkhtmltopdf技术的html转pdf文档java类库,支持html转pdf和url转pdf。 2、什么是wkhtmltopdf wkhtmltopdf是一个用webkit网页渲染引擎开发的用来将html转成 pdf的工具,可跟多种脚本语言进行集成来转换文档,有windows、linux等平…

云南森林火灾vr消防模拟安全演练系统训练消防员火灾和事故的适应和应对能力

据统计,每一场破坏性地震发生后,会引发次生的灾害,而火灾是其中之一。导致火灾的原因,推测是地震时使供电线路短路,引燃易燃物,火灾就随即发生。所以,在日常生活中,定期的消防演练还是非常必要的, VR消防&#xff0c;是VR公司深圳华锐视点利用VR虚拟现实技术&#xff0c;将VR和…

发力服务业务,龙湖集团半程领跑赢在“智慧”

成立三十载&#xff0c;龙湖集团一直是房地产行业“特立独行”的存在。 一方面&#xff0c;龙湖在对外战略方面长期量入为出&#xff0c;从不背上过重的“包袱”。 不久前&#xff0c;一则消息引发市场关注&#xff1a;龙湖集团提前偿还17亿元债务&#xff0c;已基本全部还清…

2023年国赛 高教社杯数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…

GMS基本模块TIN、Solids、Modflow2000/2005、MT3DMS、MODPATH。及其在地下水流动、溶质运移、粒子追踪方面的应用

解决地下水数值模拟技术实施过程中遇到的困难&#xff0c;从而提出切实可行的环境保护措施&#xff0c;达到有效保护环境、防治地下水污染&#xff0c;推动经济社会可持续发展的目的。 &#xff08;1&#xff09;水文地质学&#xff0c;地下水数值模拟基础理论&#xff1b;&am…

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统 em

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff…

GCC编译器优化等级的选择

GCC编译器通常提供多个优化级别供选择&#xff0c;每个级别对代码进行不同程度的优化。以下是GCC编译器常见的优化级别&#xff1a; 无优化&#xff08;-O0&#xff09;&#xff1a;这是默认的优化级别&#xff0c;编译器不执行任何优化。适用于调试目的或要求最小编译时间的情…

【LeetCode】模拟实现FILE以及认识缓冲区

模拟实现FILE以及认识缓冲区 刷新缓冲逻辑图自定义实现如何强制刷新内核缓冲区例子 刷新缓冲逻辑图 自定义实现 mystdio.h #pragma once #include <stdio.h>#define NUM 1024 #define BUFF_NOME 0x1 #define BUFF_LINE 0x2 #define BUFF_ALL 0x4typedef struct _MY_FIL…

ChatGPT-4: 半年的深度使用思考

几个月的时间一直在使用 ChatGpt-4&#xff0c;以口述语音转文字的形式说一下自己的体会。 1、选择版本 大前提&#xff1a;我使用的都是 GPT4 的版本。也就是说至少每个月要付费20$。 因为 3.5 的版本&#xff0c;实际上使用体验是非常差的&#xff0c;主要体现在答非所问上。…

c++ 命名空间

1. 基本概念  1.1 定义与使用  1.2 using语句2. 进阶语法  2.1 内嵌名字空间  2.2 扩展性  2.3 全局作用域3. 小结 1. 基本概念 名字空间本质上是自定义作用域&#xff0c;由于C设计的初衷是开发大规模软件&#xff0c;大量的软件库必然会加剧全局符号&#xff08;变量、…

Word中对象方法(Methods)的理解及示例(上)

【分享成果&#xff0c;随喜正能量】奋斗没有终点,任何时候都是一个起点&#xff0c;沉潜是为了蓄势待发&#xff0c;沉潜是为了等待因缘。鲸豚沉潜于大海&#xff0c;幽兰深藏于山谷&#xff0c;能够经得起沉潜的人&#xff0c;才会有更高的成就。正如一年的树木只能当柴烧&am…

PPPoE vs 静态:网络中的最佳选择

在企业网络中&#xff0c;选择适合的网络连接方式对于网络性能和安全至关重要。今天我将和大家分享关于PPPoE和静态IP地址的知识&#xff0c;探讨它们在企业网络中的优劣和最佳选择。本文将为您提供详细的分析和解决方案&#xff0c;帮助您在选择网络连接方式时做出明智的决策。…

Jmeter常用线程组设置策略

一、前言 ​ 在JMeter压力测试中&#xff0c;我们时常见到的几个场景有&#xff1a;单场景基准测试、单场景并发测试、单场景容量测试、混合场景容量测试、混合场景并发测试以及混合场景稳定性测试 在本篇文章中&#xff0c;我们会用到一些插件&#xff0c;在这边先给大家列出&…

小兔鲜儿 - 推荐模块

目录 动态获取数据 静态结构 获取页面参数​ 获取数据​ 类型声明 热门推荐 – 渲染页面和Tab交互 热门推荐 – 分页加载 热门推荐 – 分页条件 type 和 interface 的区别 type 和 interface 的相似之处 type 的特点和用途 interface 的特点和用途 何时使用 type…

数据结构:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序(C实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 前言一、插入排序1.直接插入排序2.希尔排序 二、选择排序1. 选择排序2.堆排序 三、交换排序1.冒泡排序2.快速排序(递归)a.hoare版(PartSort1)b.挖坑法(PartSort2)c.前后指针法(PartSort…

【云驻共创】华为云之手把手教你搭建IoT物联网应用充电桩实时监控大屏

文章目录 前言1.什么是充电桩2.什么是IOT3.什么是端、边、云、应用协同4.什么是Astro轻应用 一、玩转lOT动态实时大屏&#xff08;线下实际操作&#xff09;1.Astro轻应用说明1.1 场景说明1.2 资费说明1.3 整体流程 2.操作步骤2.1 开通设备接入服务2.2 创建产品2.3 注册设备2.4…

vue页面转pdf后分页时文字被横向割裂

效果 预期效果 //避免分页被截断async outPutPdfFn (id, title) {const _t this;const A4_WIDTH 592.28;const A4_HEIGHT 841.89;// dom的id。let target document.getElementById(pdf);let pageHeight target.scrollWidth / A4_WIDTH * A4_HEIGHT;// 获取分割dom&#xf…

static相关知识点详解

文章目录 一. 修饰成员变量二. 修饰成员方法三. 修饰代码块四. 修饰类 一. 修饰成员变量 static 修饰的成员变量&#xff0c;称为静态成员变量&#xff0c;该变量不属于某个具体的对象&#xff0c;是所有对象所共享的。 public class Student {private String name;private sta…