当前位置: 首页 > news >正文

SpringBoot整合springmvc、扩展springmvc

目录

  • 一、 SpringMVC三大组件
  • 二、 Spring MVC 组件的自动管理
    • 2.1 中央转发器(DispatcherServlet)
    • 2.2 控制器
    • 2.3 视图解析器自动管理
    • 2.4 静态资源访问
    • 2.5 消息转换和格式化
    • 2.6 欢迎页面的自动配置
  • 三、Springboot扩展springmvc
    • 3.1 视图控制器注册(请求转发)
    • 3.2 注册格式化器
    • 3.3 消息转换器扩展 Fastjson
    • 3.4 拦截器注册
  • 四、结语

一、 SpringMVC三大组件

在学习SpringBoot整合springmvc,首先要了解SpringMVC三大组件:

    1. HandlerMapping处理器映射器:建立地址与方法的映射,
      HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
    1. HandlerAdapter处理器适配器:根据地址调用方法。
      Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
    1. ViewResolver 视图解析器:处理ModelAndView数据和视图。
      ViewResolver通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

二、 Spring MVC 组件的自动管理

在Spring Boot项目中,一旦引入了 Web依赖启动器 : spring-boot-starter-web ,那么SpringBoot 整合Spring MVC框架默认实现的一些 xxxAutoConfiguration 自动配置类 就会自动生效 ( 通过配置类 把相关的类加入到IOC容器中 ) ,几乎 可以在无任何额外配置 的情况下 进行Web 开发。

SpringBoot为整合SpringMVC框架实现Web开发,主要提供了以下 自动化配置的功能特性 :
(1)内置了两个视图解析器 : ContentNegotiatingViewResolver 和 BeanNameViewResolver。
(2) 支持静态资源以及 WebJars。
(3)自动注册了转换器和格式化器。
(4)支持 Http消息转换器。
(5)自动注册了消息代码解析器。
(6)支持静态项目首页 index.html。
(7)支持定制应用图标 favicon.ico。
(8)自动初始化Web数据绑定器 : ConfigurableWebBindingInitializer。
Spring Boot 整合Spring MVC进行 Web开发 时 提供了很多默认配置,而且 大多数时候 使用 默认配置 即 可满足开发需求。
例如,Spring Boot整合Spring MVC进行Web开发时,不需要额外配置视图解析器。

2.1 中央转发器(DispatcherServlet)

在传统的 Spring MVC 项目中,需要在 web.xml 中配置中央转发器,示例如下:

<servlet><servlet-name>chapter2</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>chapter2</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

而在 Spring Boot 中,中央转发器被自动接管,无需在 web.xml 中配置(Spring Boot 项目一般不存在 web.xml),相关自动配置类为
在这里插入图片描述

2.2 控制器

在 Spring Boot 中,控制器(Controller)在注解扫描范围内自动管理,开发者只需编写控制器类并使用相应的注解(如 @Controller@RequestMapping 等)即可。

2.3 视图解析器自动管理

Spring Boot 自动配置了视图解析器相关内容,会自动包含 ContentNegotiatingViewResolverBeanNameViewResolver 这两个 bean。
ContentNegotiatingViewResolver:组合所有的视图解析器。
在传统的 Spring MVC 项目中,配置视图解析器可能如下:

<bean id="de" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"></property><property name="suffix" value="*.jsp"></property>
</bean>

在 Spring Boot 中,通过源码配置:

public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) {ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();resolver.setContentNegotiationManager((ContentNegotiationManager)beanFactory.getBean(ContentNegotiationManager.class));resolver.setOrder(-2147483648);return resolver;
}

此外,当涉及文件上传时,multipartResolver 也会被自动配置好。

2.4 静态资源访问

具体内容可参见 SpringBoot对静态资源的映射规则

2.5 消息转换和格式化

  • 消息转换器:Spring Boot 自动配置了消息转换器,例如通过 @RequestBody 注解,将请求体中的 JSON/XML 数据转换为 Java 对象。
  • 格式化转换器:自动注册了格式化转换器。对于时间类型,可以在配置文件中指定时间的模式,例如:
# 配置时间格式
spring.mvc.format.date=yyyy-MM-dd

2.6 欢迎页面的自动配置

Spring Boot 会自动指定 resources 下的 index.html 作为欢迎页面。

三、Springboot扩展springmvc

在实际开发中springboot并非完全自动化,我们往往需要根据业务需求进行自定义配置。Spring Boot 提供了多种接口和配置类,允许开发者扩展和自定义功能。

3.1 视图控制器注册(请求转发)

Spring Boot 允许我们通过实现 WebMvcConfigurer 接口的 addViewControllers 方法来注册视图控制器。

@Configuration
public class MyMVCCofnig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/tx").setViewName("success");}
}
  • @Configuration 注解表明这是一个配置类。
  • MyMVCCofnig 类实现了 WebMvcConfigurer 接口。
  • addViewControllers 方法用于注册视图控制器。在这里,我们添加了一个视图控制器,当访问 /tx 路径时,会转发到名为 success 的视图。

3.2 注册格式化器

格式化器在处理日期等数据类型时非常有用。通过实现 addFormatters 方法,我们可以自定义如何格式化和解析日期。

@Override
public void addFormatters(FormatterRegistry registry) {registry.addFormatter(new Formatter<Date>() {@Overridepublic String print(Date date, Locale locale) {return null;}@Overridepublic Date parse(String s, Locale locale) throws ParseException {return new SimpleDateFormat("yyyy-MM-dd").parse(s);}});
}
  • FormatterRegistry 用于注册自定义的格式化器。
  • 我们创建了一个 Formatter 实现,定义了如何解析字符串为 Date 对象(parse 方法)和如何将 Date 对象格式化为字符串(print 方法)。在这里,我们只实现了 parse 方法,用于将符合 “yyyy-MM-dd” 格式的字符串解析为 Date 对象。

3.3 消息转换器扩展 Fastjson

Spring Boot 默认使用 Jackson 作为 JSON 库,但有时我们需要使用 Fastjson 来处理 JSON 数据。我们可以通过配置消息转换器来扩展 Fastjson。
(1) 引入 Fastjson 依赖
在 pom.xml 中添加 Fastjson 依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version>
</dependency>

(2)配置消息转换器

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {FastJsonHttpMessageConverter fc = new FastJsonHttpMessageConverter();FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);fc.setFastJsonConfig(fastJsonConfig);converters.add(fc);
}
  • configureMessageConverters 方法允许我们配置消息转换器。
  • 我们创建了一个 FastJsonHttpMessageConverter 实例,并设置了序列化特性 SerializerFeature.PrettyFormat,使得 JSON 输出格式化。
  • 将 Fastjson 转换器添加到转换器列表中,从而扩展了 Spring Boot 的消息转换功能。

(3)控制实体类序列化
在实体类中,我们可以使用 @JSONField 注解来控制字段的序列化和反序列化。

public class User {private String username;private String password;private int age;private int score;private int gender;@JSONField(format = "yyyy-MM-dd")private Date date;
}

@JSONField 注解用于指定字段的序列化和反序列化格式。在这个例子中,date 字段被格式化为 “yyyy-MM-dd”。

3.4 拦截器注册

拦截器在请求处理过程中扮演着重要角色,可以用来进行权限检查、日志记录等。
(1)创建拦截器

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("前置拦截");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("后置拦截");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("最终拦截");}
}

(2)注册拦截器

@Override
public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/hello2");
}

addInterceptors 方法用于注册拦截器。
我们添加了 MyInterceptor 拦截器,并指定它拦截所有路径(“/**”),除了 /hello2 路径。

四、结语

  • Spring Boot在整合Spring MVC过程中提供了许多默认自动化配置和特性,开发者可以通过Spring Boot提供的 WebMvcConfigurer接口 对 MVC功能 进行 定制和扩展。
  • 如果开发者不想使用Spring Boot整合MVC时提供的一些 默认配置,而是想要 绝对 的 自定义管理,那么可以编写一个 @Configuration注解配置类,同时添加 @EnableWebMvc注解 来 关闭Spring Boot提供的 所有关于MVC功能的默认配置。

在这里插入图片描述

相关文章:

SpringBoot整合springmvc、扩展springmvc

目录 一、 SpringMVC三大组件二、 Spring MVC 组件的自动管理2.1 中央转发器&#xff08;DispatcherServlet&#xff09;2.2 控制器2.3 视图解析器自动管理2.4 静态资源访问2.5 消息转换和格式化2.6 欢迎页面的自动配置 三、Springboot扩展springmvc3.1 视图控制器注册&#xf…...

免费部署本地AI大语言模型聊天系统:Chatbox AI + 马斯克grok2.0大模型(简单5步实现,免费且比GPT4.0更好用)

摘要&#xff1a; 本文将指导您如何部署一个本地AI大语言模型聊天系统&#xff0c;使用Chatbox AI客户端应用和grok-beta大模型&#xff0c;以实现高效、智能的聊天体验。 引言&#xff1a; 由马斯克X-AI发布的Grok 2大模型以其卓越的性能超越了GPT4.0。Grok模型支持超长文本…...

音视频入门基础:MPEG2-TS专题(22)——FFmpeg源码中,获取TS流的音频信息的实现

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…...

从零搭建SpringBoot3+Vue3前后端分离项目基座,中小项目可用

文章目录 1. 后端项目搭建 1.1 环境准备1.2 数据表准备1.3 SpringBoot3项目创建1.4 MySql环境整合&#xff0c;使用druid连接池1.5 整合mybatis-plus 1.5.1 引入mybatis-plus1.5.2 配置代码生成器1.5.3 配置分页插件 1.6 整合swagger3&#xff08;knife4j&#xff09; 1.6.1 整…...

修改表字段属性,SQL总结

MYSQl varchar转为mediumtext ALTER TABLE table_name MODIFY COLUMN column_name mediumtext; ALTER TABLE table_name MODIFY COLUMN column_name varchar(255) 1. 修改字段的数据类型 使用 MODIFY COLUMN 可以改变字段的数据类型、长度、默认值或注释&#xff0c;但不会更…...

go-xorm连接

package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm" )func MysqlDbContent() {//数据库基本信息var (userName string "root"password string "12345678"ipAddress string &…...

Excel 面试 04 查找函数 XLOOKUP

Excel 的 XLOOKUP 函数是一个功能强大的查找工具&#xff0c;用于从一个范围或数组中搜索值并返回对应结果。它是 VLOOKUP 和 HLOOKUP 的更高级替代品&#xff0c;支持更多灵活功能。 语法 XLOOKUP(lookup_value, lookup_array, return_array, [if_not_found], [match_mode], …...

Flannel和Calico之对比(Comparison between Flannel and Calico)

K8S网络插件&#xff08;CNI&#xff09;&#xff1a;Flannel和Calico详细对比 Flannel和Calico是Kubernetes中最常用的两种CNI&#xff08;Container Network Interface&#xff09;插件&#xff0c;各自针对不同的网络需求提供解决方案。以下是对这两种插件的详细讲解&#…...

Spring Boot + Redisson 封装分布式锁

目标&#xff1a;一行代码调用&#xff0c;简单粗暴。 基操&#xff1a;自动加锁&#xff0c;自动解锁&#xff0c;自动处理异常&#xff0c;自动处理锁超时等。 安装 redis redisson <dependency><groupId>org.springframework.boot</groupId><artifac…...

QWEN2 模型架构配置;GGUF的概念:实现量化存储

Qwen2不同配置的模型,其头数量和MLP大小有所不同,以下是具体信息 : Qwen2-0.5B:query heads数量为14,head size为64,intermediate size(即MLP)为4864。Qwen2-1.5B:query heads数量为12,head size为128,intermediate size为8960 。Qwen2-7B:query heads数量为28,he…...

window如何将powershell以管理员身份添加到右键菜单?(按住Shift键显示)

window如何将powershell以管理员身份添加到右键菜单&#xff1f; 在 Windows 中&#xff0c;将 PowerShell 以管理员身份添加到右键菜单&#xff0c;可以让你在需要提升权限的情况下快速打开 PowerShell 窗口。以下是详细的步骤&#xff0c;包括手动编辑注册表和使用注册表脚本…...

spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验

文章目录 一、JSR 303后台数据校验1.1 什么是 JSR303&#xff1f;1.2 为什么使用 JSR 303&#xff1f; 二、Spring Boot 中使用数据校验2.1 基本注解校验2.1.1 使用步骤2.1.2 举例Valid注解全局统一异常处理 2.2 分组校验2.2.1 使用步骤2.2.2 举例Validated注解Validated和Vali…...

实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制

背景 前面我们以 docker compose 容器化的方式本地部署了 Dify 社区版&#xff0c;并快速体验了其聊天助手、工作量编排以及智能体&#xff08;Agent&#xff09;功能。不过后续实际生产环境使用时遇到了忘记密码、如何开启SSL以支持HTTPS、如何突破知识库文档上传的大小限制和…...

mugen

title: 走进 Mugen&#xff1a;性能测试领域的得力助手 date: ‘2024-12-30’ category: blog tags: Mugen性能测试开源项目系统评估 sig: QA archives: ‘2024-12’ author:way_back summary: Mugen 作为一款优秀的性能测试工具&#xff0c;以其丰富的功能、灵活的配置和精准…...

CannotRetrieveUpdates alert in disconnected OCP 4 cluster解决

环境&#xff1a; Red Hat OpenShift Container Platform (RHOCP) 4 问题&#xff1a; Cluster Version Operator 不断发送警报&#xff0c;表示在受限网络/断开连接的 OCP 4 集群中无法接收更新。 在隔离的 OpenShift 4 集群中看到 CannotRetrieveUpdates 警报&#xff1a; …...

计算机网络 (16)数字链路层的几个共同问题

一、封装成帧 封装成帧是数据链路层的一个基本问题。数据链路层把网络层交下来的数据构成帧发送到链路上&#xff0c;以及把接收到的帧中的数据取出并上交给网络层。封装成帧就是在一段数据的前后分别添加首部和尾部&#xff0c;构成了一个帧。接收端在收到物理层上交的比特流后…...

细说STM32F407单片机通过IIC读写EEPROM 24C02

目录 一、操作说明 二、工程配置 1、时钟、DEBUG、GPIO、USART6、NVIC、Code Generator 2、 IIC2 &#xff08;1&#xff09;Master Features组&#xff0c;主设备参数 &#xff08;2&#xff09;Slave Features组&#xff0c;从设备参数 三、软件设计 1、KELED 2、E…...

【AimRT】现代机器人通信中间件 AimRT

目录 一、什么是AimRT二、AimRT与ROS22.1 定位与设计2.2 组成与通信方式对比 三、AimRT基本概念3.1 Node、Pkg 和 Module3.2 Protocol、Channel、Rpc 和 Filter3.3 App模式 和 Pkg模式3.4 Executor3.5 Plugin 一、什么是AimRT AimRT 是智元机器人公司自主研发的一款机器人通信…...

Unity 读Excel,读取xlsx文件解决方案

Unity读取表格数据 效果&#xff1a; 思路&#xff1a; Unity可以解析Json&#xff0c;但是读取Excel需要插件的帮助&#xff0c;那就把这个功能分离开&#xff0c;读表插件就只管读表转Json&#xff0c;Unity就只管Json解析&#xff0c;中间需要一个存储空间&#xff0c;使用…...

R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别

全文链接&#xff1a;https://tecdat.cn/?p38667 摘要&#xff1a;在母婴暴露于空气污染对儿童健康影响的研究中&#xff0c;常需对孕期暴露情况与健康结果进行回归分析。分布滞后非线性模型&#xff08;DLNM&#xff09;是一种常用于估计暴露 - 时间 - 响应函数的统计方法&am…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...