写点什么

开源一夏 |Spring MVC 深度学习

作者:叶秋学长
  • 2022 年 8 月 10 日
    福建
  • 本文字数:1899 字

    阅读完需:约 6 分钟

开源一夏 |Spring MVC深度学习

 该文章收录专栏:

叶秋学长Spring系列专栏

叶秋学长主页:

新星计划第三季人工智能赛道TOP2;退役复学在校大学生,全栈JAVA领域创作者,目光所至,皆为华夏

目录


MVC

28.Spring MVC 的核心组件?

29.Spring MVC 的工作流程?

30.SpringMVC Restful风格的接口的流程是什么样的呢?



今天叶秋学长带领大家学习Spring系列专栏最后一节 Spring MVC.

28.Spring MVC 的核心组件?

  1. DispatcherServlet:前置控制器,是整个流程控制的核心,控制其他组件的执行,进行统一调度,降低组件之间的耦合性,相当于总指挥。

  2. Handler:处理器,完成具体的业务逻辑,相当于 Servlet 或 Action。

  3. HandlerMapping:DispatcherServlet 接收到请求之后,通过 HandlerMapping 将不同的请求映射到不同的 Handler。

  4. HandlerInterceptor:处理器拦截器,是一个接口,如果需要完成一些拦截处理,可以实现该接口。

  5. HandlerExecutionChain:处理器执行链,包括两部分内容:Handler 和 HandlerInterceptor(系统会有一个默认的 HandlerInterceptor,如果需要额外设置拦截,可以添加拦截器)。

  6. HandlerAdapter:处理器适配器,Handler 执行业务方法之前,需要进行一系列的操作,包括表单数据的验证、数据类型的转换、将表单数据封装到 JavaBean 等,这些操作都是由 HandlerApater 来完成,开发者只需将注意力集中业务逻辑的处理上,DispatcherServlet 通过 HandlerAdapter 执行不同的 Handler。

  7. ModelAndView:装载了模型数据和视图信息,作为 Handler 的处理结果,返回给 DispatcherServlet。

  8. ViewResolver:视图解析器,DispatcheServlet 通过它将逻辑视图解析为物理视图,最终将渲染结果响应给客户端。

29.Spring MVC 的工作流程?


点击并拖拽以移动

编辑

Spring MVC 的工作流程

  1. 客户端向服务端发送一次请求,这个请求会先到前端控制器 DispatcherServlet(也叫中央控制器)。

  2. DispatcherServlet 接收到请求后会调用 HandlerMapping 处理器映射器。由此得知,该请求该由哪个 Controller 来处理(并未调用 Controller,只是得知)

  3. DispatcherServlet 调用 HandlerAdapter 处理器适配器,告诉处理器适配器应该要去执行哪个 Controller

  4. HandlerAdapter 处理器适配器去执行 Controller 并得到 ModelAndView(数据和视图),并层层返回给 DispatcherServlet

  5. DispatcherServlet 将 ModelAndView 交给 ViewReslover 视图解析器解析,然后返回真正的视图。

  6. DispatcherServlet 将模型数据填充到视图中

  7. DispatcherServlet 将结果响应给客户端

Spring MVC 虽然整体流程复杂,但是实际开发中很简单,大部分的组件不需要开发人员创建和管理,只需要通过配置文件的方式完成配置即可,真正需要开发人员进行处理的只有 Handler(Controller) 、View 、Model

当然我们现在大部分的开发都是前后端分离,Restful 风格接口,后端只需要返回 Json 数据就行了。

30.SpringMVC Restful 风格的接口的流程是什么样的呢?

PS:这是一道全新的八股,毕竟 ModelAndView 这种方式应该没人用了吧?现在都是前后端分离接口,八股也该更新换代了。

我们都知道 Restful 接口,响应格式是 json,这就用到了一个常用注解:**@ResponseBody**

    @GetMapping("/user")    @ResponseBody    public User user(){        return new User(1,"张三");    }
复制代码


点击并拖拽以移动

加入了这个注解后,整体的流程上和使用 ModelAndView 大体上相同,但是细节上有一些不同:


点击并拖拽以移动

编辑

Spring MVC Restful 请求响应示意图

  1. 客户端向服务端发送一次请求,这个请求会先到前端控制器 DispatcherServlet

  2. DispatcherServlet 接收到请求后会调用 HandlerMapping 处理器映射器。由此得知,该请求该由哪个 Controller 来处理

  3. DispatcherServlet 调用 HandlerAdapter 处理器适配器,告诉处理器适配器应该要去执行哪个 Controller

  4. Controller 被封装成了 ServletInvocableHandlerMethod,HandlerAdapter 处理器适配器去执行 invokeAndHandle 方法,完成对 Controller 的请求处理

  5. HandlerAdapter 执行完对 Controller 的请求,会调用 HandlerMethodReturnValueHandler 去处理返回值,主要的过程:

    5.1. 调用 RequestResponseBodyMethodProcessor,创建 ServletServerHttpResponse(Spring 对原生 ServerHttpResponse 的封装)实例

    5.2.使用 HttpMessageConverter 的 write 方法,将返回值写入 ServletServerHttpResponse 的 OutputStream 输出流中

    5.3.在写入的过程中,会使用 JsonGenerator(默认使用 Jackson 框架)对返回值进行 Json 序列化

  6. 执行完请求后,返回的 ModealAndView 为 null,ServletServerHttpResponse 里也已经写入了响应,所以不用关心 View 的处理

本期学习到此为止,Spring 系列专栏也结束了,后期学长还会带领大家学习 Spring boot 系列专栏学习!!!关注博主不迷路,叶秋学长带你上高速~~~

发布于: 刚刚阅读数: 3
用户头像

叶秋学长

关注

还未添加个人签名 2022.07.01 加入

全栈JAVA领域创作者

评论

发布
暂无评论
开源一夏 |Spring MVC深度学习_spring_叶秋学长_InfoQ写作社区