首页 > 其他分享 >[面试题]Spring MVC

[面试题]Spring MVC

时间:2024-06-16 10:57:02浏览次数:10  
标签:面试题 拦截器 HTTP Spring REST MVC 方法

考虑到 Spring MVC 和 Rest 关系比较大,所以本文一共分成两大块:

  • Spring MVC

  • REST

Spring MVC

Spring MVC 框架有什么用?

Spring Web MVC 框架提供”模型-视图-控制器”( Model-View-Controller )架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。

MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。

介绍下 Spring MVC 的核心组件?

Spring MVC 一共有九大核心组件,分别是:

MultipartResolver

LocaleResolver

ThemeResolver

HandlerMapping

HandlerAdapter

HandlerExceptionResolver

RequestToViewNameTranslator

ViewResolver

FlashMapManager

虽然很多,但是在前后端分离的架构中,最关键的只有 HandlerMapping + HandlerAdapter + HandlerExceptionResolver 。

描述一下 DispatcherServlet 的工作流程?

DispatcherServlet 的工作流程可以用一幅图来说明:
在这里插入图片描述

DispatcherServlet 的工作流程

发送请求

用户向服务器发送 HTTP 请求,请求被 Spring MVC 的调度控制器 DispatcherServlet 捕获。

映射处理器

DispatcherServlet 根据请求 URL ,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。

即 HandlerExecutionChain 中,包含对应的 Handler 对象和拦截器们。

此处,对应的方法如下:> // HandlerMapping.java> > @Nullable> HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;>

处理器适配

DispatcherServlet 根据获得的 Handler,选择一个合适的HandlerAdapter 。(附注:如果成功获得 HandlerAdapter 后,此时将开始执行拦截器的 #preHandler(…) 方法)。

提取请求 Request 中的模型数据,填充 Handler 入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:

HttpMessageConverter :会将请求消息(如 JSON、XML 等数据)转换成一个对象。

数据转换:对请求消息进行数据转换。如 String 转换成 Integer、Double 等。

数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。

数据验证: 验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中。

Handler(Controller) 执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象。

此处,对应的方法如下:> // HandlerAdapter.java> > @Nullable> ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;>

.

图中没有 ④ 。

解析视图

根据返回的 ModelAndView ,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver),解析出 View 对象,然后返回给 DispatcherServlet。

此处,对应的方法如下:> // ViewResolver.java> > @Nullable> View resolveViewName(String viewName, Locale locale) throws Exception;>

⑥ ⑦ 渲染视图 + 响应请求

ViewResolver 结合 Model 和 View,来渲染视图,并写回给用户( 浏览器 )。

此处,对应的方法如下:> // View.java> > void render(@Nullable Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;>

这样一看,胖友可能有点懵逼,所以还是推荐看看:

《精尽 Spring MVC 源码分析 —— 组件一览》

《精尽 Spring MVC 源码分析 —— 请求处理一览》

但是 Spring MVC 的流程真的一定是酱紫么

既然这么问,答案当然不是。对于目前主流的架构,前后端已经进行分离了,所以 Spring MVC 只负责 Model 和 Controller 两块,而将 View 移交给了前端。所以,在上图中的步骤 ⑤ 和 ⑥ 两步,已经不在需要。

那么变成什么样了呢?在步骤 ③ 中,如果 Handler(Controller) 执行完后,如果判断方法有 @ResponseBody 注解,则直接将结果写回给用户( 浏览器 )。

但是 HTTP 是不支持返回 Java POJO 对象的,所以需要将结果使用HttpMessageConverter 进行转换后,才能返回。例如说,大家所熟悉的 FastJsonHttpMessageConverter ,将 POJO 转换成 JSON 字符串返回。

标签:面试题,拦截器,HTTP,Spring,REST,MVC,方法
From: https://blog.csdn.net/gaozhi0/article/details/139716695

相关文章

  • SpringAI快速上手
    一、导入依赖 镜像(导入maven依赖)<repositories><repository><id>spring-snapshots</id><name>SpringSnapshots</name><url>https://repo.spring.io/snapshot</url><releases>......
  • Java毕业设计-基于springboot开发的图书个性化推荐系统设计与实现-毕业论文(附毕设源代
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、前台首页功能模块2、管理员功能模块3、学生功能模块四、毕设内容和源代码获取总结Java毕业设计-基于springboot开发的图书个性化推荐系统......
  • Java毕业设计-基于springboot开发的图书管理系统-毕业论文(附毕设源代码)
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、个人中心2、管理员管理3、用户管理4、图书出版社管理5、公告类型管理6、所在书架管理7、图书类型管理8、论坛管理9、公告信息管理10、图书信息......
  • springboot事务管理的机制是什么
    SpringBoot的事务管理机制实质上是基于Spring框架的事务处理机制。其主要目的是确保一系列数据库操作要么全部成功,要么全部失败(回滚),从而维护数据的完整性和一致性。SpringBoot事务管理遵循ACID四大特性:1、原子性(Atomicity)事务是一个原子操作单元,其对数据的修改要么全都执......
  • springboot的多线程事务能否保证事务的一致性
    在SpringBoot中,多线程事务的一致性取决于事务管理的配置和实现。SpringFramework本身提供了多种事务管理的方式,如基于注解的声明式事务、编程式事务等。在多线程环境下,要保证事务的一致性需要特别注意以下几点:事务传播属性(TransactionPropagation):在进行多线程事务处理时,需......
  • servlet数量太多,搞个轻量级springmvc
    这两天用jsp+servlet+MySQL开发了一个企业网站,后台和前台都有,功能已经实现了,现在总结发现,servlet是真的多,我这个系统有7个表,后台实现一遍增删改查,就得有28个servlet,而且还有前台的部分,servlet的数量真的太多了,想想看springmvc,其实是可以写一个轻量级的springmvc的。在Servl......
  • Spring基础 - SpringMVC请求流程和案例
    前文我们介绍了Spring框架和Spring框架中最为重要的两个技术点(IOC和AOP),那我们如何更好的构建上层的应用呢(比如web应用),这便是SpringMVC;SpringMVC是Spring在SpringContainerCore和AOP等技术基础上,遵循上述WebMVC的规范推出的web开发框架,目的是为了简化Java栈的web开发。......
  • 前端面试题日常练-day71 【面试题】
    题目希望这些选择题能够帮助您进行前端面试的准备,答案在文末好的,以下是另外五个与Sass相关的选择题:Sass中,以下哪个符号用于声明一个变量?a)$b)@c)#d)&在Sass中,以下哪个符号用于引入其他Sass文件?a)@importb)$c)#d)&Sass中的混合器(Mixin)用于什么目的?a......
  • Spring中XML的解析过程
    1.AbstractApplicationContext.obtainBeanFactory方法中,模版调用2.AbstractRefreshableApplicationContex.refreshBeanFactory该方法中会创建DefaultListableBeanFactory用于收集BeanDefinition对象会继续模版调用3.AbstractXMLApplicationContext.loadBeanDefinitions方法......
  • 前端面试题日常练-day69 【面试题】
    题目希望这些选择题能够帮助您进行前端面试的准备,答案在文末TypeScript中,以下哪个关键字用于声明一个变量的类型为联合类型?a)unionb)anyc)alld)|在TypeScript中,以下哪个符号用于声明一个变量的类型为对象类型?a){}b)[]c)()d)<>TypeScript中的枚举(Enum......