考虑到 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