深入理解Spring MVC上

news/2024/4/17 1:11:29/文章来源:https://blog.csdn.net/qiaotl/article/details/129204102

Spring MVC 是一种基于 Spring 框架的 Web 框架,它提供了一种基于 Model-View-Controller(MVC)的设计模式,用于构建 Web 应用程序。在 Spring MVC 中,Controller 接受并处理 HTTP 请求,并将其转发给适当的 Service、Repository 或其他组件进行处理。处理完成后,Controller 将结果返回给 View 层,View 层将结果渲染成 HTML 页面返回给客户端。

Spring MVC 框架提供了一些内置的组件,例如 HandlerMapping、DispatcherServlet、ViewResolver 等,这些组件可以帮助开发者快速构建 Web 应用程序。

HandlerMapping 负责将客户端请求映射到处理请求的控制器(Controller)上。当一个请求到达 Spring 应用时,HandlerMapping会根据请求的 URL和其它条件来确定调用哪个控制器的哪个方法来处理请求。

DispatcherServlet是一个中央调度器,负责协调处理客户端请求、分发请求到对应的控制器(Controller)以及返回响应。DispatcherServlet 基于 Servlet API 提供了一个入口,它会拦截所有的客户端请求,并将请求发送到适当的处理程序进行处理。其主要作用如下:

  1. 接收客户端请求并进行处理:DispatcherServlet 监听客户端请求,并负责将请求发送到适当的处理程序进行处理。

  1. 委派请求到适当的处理程序:DispatcherServlet 使用 HandlerMapping 将请求映射到适当的处理程序。

  1. 处理请求并生成响应:DispatcherServlet 负责协调处理程序执行请求,并将结果返回给客户端。

在 Spring MVC 中,DispatcherServlet 可以配置多个,并且每个 DispatcherServlet 可以使用不同的配置文件,处理不同的 URL 请求。

ViewResolver 负责将控制器(Controller)返回的逻辑视图名(如 "index"、"login" 等)解析成实际的视图(View)对象,以便渲染成最终的响应内容并返回给客户端。具体来讲,ViewResolver负责两项任务:

  1. 解析逻辑视图名:当控制器处理完请求后,返回一个逻辑视图名,而不是实际的视图对象。因此,ViewResolver 的第一个作用就是将逻辑视图名解析成实际的视图对象,以便后续进行渲染和返回。

  1. 提供视图的查找和解析策略:ViewResolver 可以配置多个实现,每个实现都有不同的查找和解析策略,比如根据请求路径、请求参数、请求头等来决定哪个视图实现去处理请求。在 Spring MVC 中,ViewResolver 是一个接口,具体的实现有多种,比如 InternalResourceViewResolver、FreeMarkerViewResolver、VelocityViewResolver 等,它们分别对应了不同的视图技术,比如 JSP、FreeMarker、Velocity 等。

需要注意的是,DispatcherServlet和ViewResolver 只是 Spring MVC 框架中的一部分,它并不是 Spring 框架本身的核心组件。而 Spring 框架的核心组件是 ApplicationContext,它提供了 Spring 的核心功能,包括依赖注入、AOP 等。DispatcherServlet ,ViewResolver需要和 ApplicationContext 是协同工作的,加载和管理 Spring MVC 的相关组件和配置。

下面通过例子来实际看下在spring中DispatcherServlet和ViewResolver如何和ApplicationContext协同工作,加载和管理Spring MVC的相关组件和配置。在 Spring 中,ApplicationContext 可以通过加载 Spring MVC 配置文件(如 XML 文件)来管理 Spring MVC 的相关组件和配置。加载 Spring MVC 配置文件时,需要使用 org.springframework.web.servlet.DispatcherServlet 类作为前端控制器,并将其配置为 Web 应用程序的Servlet。具体步骤是:

1.在 Web 应用程序的 web.xml 文件中定义一个 Servlet,名称为 DispatcherServlet,并将其映射到一个 URL,以便它能够处理传入的 HTTP 请求。

在 DispatcherServlet 的初始化参数中指定 Spring MVC 配置文件的路径,这可以通过在 web.xml 文件中为 DispatcherServlet 添加 <init-param> 元素来完成。具体配置内容如下图所示:在spring-mvc-config.xml文件中指定了controller组件,viewResolver和interceptor。

在程序启动部分,添加代码使用了 AnnotationConfigWebApplicationContext 类来加载 Spring MVC 配置文件,并将其设置为 DispatcherServlet 的上下文。

AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.example.config");
ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcherServlet", new DispatcherServlet(context));
registration.setLoadOnStartup(1);
registration.addMapping("/");

上面的代码片段是采用xml文件配置方式,如果是spring boot,因为spring boot可以自动加载配置,会更加简单。具体来说是:Spring Boot使用@SpringBootApplication注解标记的主类(通常是一个包含main方法的类)被用作应用程序上下文的根。当应用程序启动时,Spring Boot会创建一个Spring应用程序上下文,并自动加载所有在classpath中的bean定义。这些bean定义包括@Configuration注解标记的配置类、@Component注解标记的组件以及其他Spring Boot自动配置类。

对于Spring MVC相关组件和配置,Spring Boot会自动加载WebMvcAutoConfiguration自动配置类,并为应用程序提供必要的基础设施。WebMvcAutoConfiguration包括一系列的自动配置类,它们用于配置视图解析器、处理器映射、HTTP消息转换器、静态资源处理等功能。这些自动配置类可以通过在应用程序的配置文件中进行配置和修改。

如下图所示:创建一个Spring MVC的配置类,该类可以使用@Configuration注解进行标注,并通过@EnableWebMvc启用Spring MVC的相关功能。在该配置类中自定义了ViewResolver和ResourceHandlers;另外,创建了Controller来返回视图逻辑名称,在 Controller 中返回 "hello" 作为逻辑视图名,ViewResolver 会将其解析为 "/WEB-INF/views/hello.jsp"。在主程序Application class中,因为添加了@SpringBootApplication注解,所以Spring的ApplicationContext会自动加载和管理Spring MVC的相关组件和配置,包括视图解析器、静态资源处理程序、控制器类等。

可以看到不管是xml配置方式,还是Java注解配置方式,在实际项目中可能都需要自定义配置ViewResolver,那么Spring提供了哪些ViewResolver呢?Spring提供了常用的六种ViewResolver:

InternalResourceViewResolver:是 Spring MVC 中最常用的视图解析器。它将逻辑视图名解析为 JSP、HTML、FreeMarker或其他模板,通常用于在 Web 应用程序中生成 HTML 响应。使用 InternalResourceViewResolver 可以配置前缀和后缀来指定视图的文件路径和扩展名。在配置的过程中,Spring MVC 会将逻辑视图名称添加到前缀和后缀之间,从而生成最终的视图路径。

ResourceBundleViewResolver :是一个支持国际化的视图解析器。它使用 Java Properties 文件来保存视图解析器的配置信息,同时支持根据区域设置(Locale)加载不同的视图。

XmlViewResolver: 是一个基于 XML 配置文件的视图解析器。它通过解析 XML 文件中的元素来生成 View 实例,并将其添加到视图解析器中。

VelocityViewResolver :是一个用于解析 Velocity 模板的视图解析器。它将逻辑视图名解析为 Velocity 模板文件,并将其渲染为 HTML。

FreeMarkerViewResolver :是一个用于解析 FreeMarker 模板的视图解析器。它将逻辑视图名解析为 FreeMarker 模板文件,并将其渲染为 HTML。

在前后端不分离的情况下,更多的场景是controller中返回视图名称,视图解析器将视图名称转换成实际的视图对象,进行渲染、显示。现在,大部分项目都是前后端分离的情况,对于后端的controller更多的是返回JSON格式或者text格式的数据,那么对于这类场景,spring mvc是如何处理的呢?

实际上,在Spring MVC中,视图解析器(View Resolver)和消息转换器(Message Converter)是两个关键组件,用于将控制器返回的数据转换为合适的格式并渲染到客户端。视图解析器主要负责根据控制器返回的视图名称(View Name)来定位视图,并将模型数据(Model Data)与视图进行合并渲染。消息转换器主要负责将控制器返回的数据转换为客户端需要的格式,如JSON、XML等。Spring MVC中自带了很多消息转换器,如MappingJackson2HttpMessageConverter(用于将对象转换为JSON)、StringHttpMessageConverter(用于将字符串转换为文本格式)等。当控制器返回JSON格式的数据时,Spring MVC会使用MappingJackson2HttpMessageConverter将数据转换为JSON格式,并将其渲染到客户端。此时,视图解析器并不会介入处理。因为JSON格式的数据并不需要进行视图渲染,所以Spring MVC会直接将JSON格式的数据返回给客户端。当然,如果控制器返回的数据格式不是JSON,而是HTML、XML等格式,则Spring MVC会根据配置的视图解析器(View Resolver)来定位视图,并将数据与视图进行合并渲染。在这个过程中,消息转换器不会介入处理。Spring MVC包含以下几种Message Converter组件:

  1. ByteArrayHttpMessageConverter:用于处理字节数组数据,例如图片和文件。

  1. StringHttpMessageConverter:用于处理文本字符串数据。

  1. ResourceHttpMessageConverter:用于处理org.springframework.core.io.Resource对象。

  1. SourceHttpMessageConverter:用于处理javax.xml.transform.Source对象。

  1. FormHttpMessageConverter:用于处理application/x-www-form-urlencoded和multipart/form-data格式的表单数据。

  1. MappingJackson2HttpMessageConverter:用于处理JSON格式的数据,并将其转换为Java对象。

  1. MappingJackson2XmlHttpMessageConverter:用于处理XML格式的数据,并将其转换为Java对象。

  1. Jaxb2RootElementHttpMessageConverter:用于处理XML格式的数据,并将其转换为Java对象,基于JAXB实现。

Spring MVC默认情况下会注册上述所有的Message Converter组件,以便能够处理不同的请求和响应数据类型。当Spring MVC收到请求时,会根据请求头信息中的Content-Type来选择合适的Message Converter进行处理,并将请求数据转换为Java对象。同样,当Spring MVC发送响应时,也会根据响应头信息中的Accept来选择合适的Message Converter进行处理,并将Java对象转换为响应数据。

以上就是对Spring MVC中主要概念的梳理,下一篇博客将用spring官网提供的spring mvc showcase的代码为例子,详细介绍spring mvc中常见场景如何实现。

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

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

相关文章

多表left join 慢sql问题

作为个人记录&#xff0c;后续再填坑a对p是1对多 ,p对llup 1对多SELECTa.id,p.id,t1.id FROMliv_series_product aINNER JOIN liv_product p ON p.id a.product_idLEFT JOIN ( SELECT llup.id, llup.product_id, llup.room_id FROM liv_live_user_product llup WHERE llup.ro…

Tomcat部署及多实例

Tomcat部署及多实例一、Tomcat简介1、Tomcat核心组件2、什么是JSP二、Tomcat数据流向1、Tomcat数据流向2、Tomcat-Nginx数据流向三、Tomcat服务部署安装1、安装jdk包2、解压Tomcat所需的安装包3、在/etc/profile添加环境变量4、启动服务并查看5、在浏览器网页验证6、创建用户&a…

为什么硬件性能监控很重要

当今的混合网络环境平衡了分布式网络和现代技术的实施。但它们并不缺少一个核心组件&#xff1a;服务器。保持网络正常运行时间归结为监控和管理导致网络停机的因素。极有可能导致性能异常的此类因素之一是硬件。使用硬件监控器监控网络硬件已成为一项关键需求。 硬件监视器是…

优化知识管理方法丨整理零碎信息,提高数据价值

信息流时代&#xff0c;知识成集合倍数增长&#xff0c;看似我们学习了很多知识&#xff0c;但知识零碎无系统&#xff0c;知识之间缺乏联系&#xff0c;没有深度&#xff0c;所以虽然你很努力&#xff0c;但你发现自己的能力增长特别缓慢&#xff0c;你需要整理知识将零散的知…

蓝桥杯:染色时间

蓝桥杯&#xff1a;染色时间https://www.lanqiao.cn/problems/2386/learning/?contest_id80 问题描述 输入格式 输出格式 样例输入输出 样例输入 样例输出 评测用例规模与约定 解题思路&#xff1a;优先队列 AC代码(Java)&#xff1a; 问题描述 小蓝有一个 n 行 m 列…

std::chrono笔记

文章目录1. radio原型作用示例2. duration原型&#xff1a;作用示例3. time_point原型作用示例4. clockssystem_clock示例steady_clock示例high_resolution_clock先说感觉&#xff0c;这个库真恶心&#xff0c;刚接触感觉跟shi一样&#xff0c;特别是那个命名空间&#xff0c;太…

vue2 diff算法

diff是什么 diff 算法是一种通过同层的树节点进行比较的高效算法 其有两个特点&#xff1a; ♥比较只会在同层级进行, 不会跨层级比较 ♥在diff比较的过程中&#xff0c;循环从两边向中间比较 diff 算法的在很多场景下都有应用&#xff0c;在 vue 中&#xff0c;作用于虚拟 dom…

预备2-CMD常用命令

CMD常用命令 先学简单常用的, 其余的要用在学 打开Cmd窗口 Win键R> 输入Cmd回车鼠标点击开始 > 附件>Cmd打开一个窗口,在地址栏输入cmd 操作目录 1.dir 查询当前目录有哪些文件 2.cd.. 上一级目录 3.cd e: 切换到E盘 4.d: 直接去d盘 5.cd /d e:abc 直接去E盘的abc目…

2023年房地产行业研究报告

第一章 行业发展概况 房地产业是指以土地和建筑物为经营对象&#xff0c;从事房地产开发、建设、经营、管理以及维修、装饰和服务的集多种经济活动为一体的综合性产业&#xff0c;是具有先导性、基础性、带动性和风险性的产业。主要包括&#xff1a;土地开发&#xff0c;房屋的…

解决AAC音频编码时间戳的计算问题

1.主题音频是流式数据&#xff0c;并不像视频一样有P帧和B帧的概念。就像砌墙一样&#xff0c;咔咔往上摞就行了。一般来说&#xff0c;AAC编码中生成文件这一步&#xff0c;如果使用的是OutputStream流写入文件的话&#xff0c;就完全不需要计算时间。但在音视频同步或者使用A…

debian 部署nginx https

我是flask 处理请求单进程&#xff0c; 差点意思 &#xff0c; 考虑先flask 在往下走 一&#xff1a;安装nginx 因为我是debian 系统&#xff0c;所以我的建议是直接 sudo apt-get install nginx 你也可以选择在官网下载&#xff0c; 但是我搭建ssl 的时候安装openssl非常的麻…

【无标题】(2019)NOC编程猫创新编程复赛小学组真题含参考

&#xff08;2019&#xff09;NOC编程猫创新编程复赛小学组最后6道大题。前10道是选择填空题 略。 这道题是绘图题&#xff0c;没什么难度&#xff0c;大家绘制这2个正十边形要注意&#xff1a;一是不要超出舞台&#xff1b;二是这2个正十边形不要相交。 这里就不给出具体程序了…

数睿通2.0数据服务功能模块发布

文章目录引言API 目录API 权限API 日志结语引言 数睿通 2.0 之前基本完成了数据集成和数据开发两大模块&#xff0c;也因此得到了一些朋友的帮助和支持&#xff0c;在此由衷的表示感谢&#xff0c;你们的支持便是我们更新的最大动力&#xff01; 目前&#xff0c;数据服务模块…

色环电阻的阻值如何识别

这种是色环电阻&#xff0c;其外表有一圈圈不同颜色的色环&#xff0c;现在在一些电器和电源电路中还有使用。下面的两种色环电阻它颜色还不一样&#xff0c;一个蓝色&#xff0c;一个土黄色&#xff0c;其实这个蓝色的属于金属膜色环电阻&#xff0c;外表涂的是一层金属膜&…

狂神说:面向对象(三)——多态

多态// 对象能执行什么方法&#xff0c;主要看对象左边的类型&#xff0c;和右边的没有关系多态&#xff1a;同一方法可以根据发送对象的不同而采用不同的行为方式父类&#xff1a;public class Person {public void run(){System.out.println("Person > run");}}…

【并发编程学习篇】深入理解CountDownLatch

一、CountDownLatch介绍 CountDownLatch&#xff08;闭锁&#xff09;是一个同步协助类&#xff0c;允许一个或多个线程等待&#xff0c;直到其他线程完成操作集。CountDownLatch使用给定的计数值&#xff08;count&#xff09;初始化。await方法会阻塞直到当前的计数值被coun…

只需四步,手把手教你打造专属数字人

伴随ChatGPT的问世&#xff0c;在技术与商业运作上都日渐发展成熟的数字人产业正持续升温。去年9月&#xff0c;北京市发布了国内首个数字人产业专项支持政策&#xff0c;提出将依托国家文化专网将数字人纳入文化数据服务平台。以数字人、ChatGPT为代表的互联网3.0创新应用产业…

kali下安装Volatility

一、About Volatility Volatility是一款开源内存取证框架&#xff0c;能够对导出的内存镜像进行分析&#xff0c;通过获取内核数据结构&#xff0c;使用插件获取内存的详细情况以及系统的运行状态。 Volatility是一款非常强大的内存取证工具,它是由来自全世界的数百位知名安全…

FAST‘23《λ-IO: A Unified IO Stack for Computational Storage》论文解读

FAST’23《λ-IO: A Unified IO Stack for Computational Storage》论文解读 Data:2023-2-27 Ref: Z. Yang et al., “λ-IO: A Unified IO Stack for Computational Storage,” in 21st USENIX Conference on File and Storage Technologies (FAST 23), Santa Clara, CA, Feb.…

数据可视化第二版-03部分-06章-比较与排序

文章目录数据可视化第二版-03部分-06章-比较与排序总结可视化视角-比较与排序代码实现创建虚拟环境1. python版本管理2.切换到指定版本后安装虚拟环境切换路径到文件当前路径柱形图环形柱状图子弹图哑铃图雷达图词云图教材截图数据可视化第二版-03部分-06章-比较与排序 总结 …