SpringMVC工作流程源码剖析

SpringMVC工作流程源码剖析原文链接:https://juejin.im/post/5e6b0ee3e51d4526f65cdb50.0x0先看名词DispactherServlet:SpringMVC的心脏,所有的请求从这里进入,也从这里出去HandlerAdapter:请求处理器HandlerMapping:请求和处理对象间的映射关系,可以理解为地址/api对应@RequestMapping(“/…

大家好,又见面了,我是你们的朋友全栈君。

原文链接:

https://juejin.im/post/5e6b0ee3e51d4526f65cdb50.

0x0 先看名词

  • DispactherServlet:SpringMVC 的心脏,所有的请求从这里进入,也从这里出去
  • HandlerAdapter:请求处理器
  • HandlerMapping:请求和处理对象间的映射关系,可以理解为 地址 /api 对应 @RequestMapping(“/api”)
  • doDispatchSpringMVC 处理请求的方法
  • ModelAndView:视图响应对象,例如我们Controller返回一个字符串,都会被包装成它
  • ViewResolvers:视图解析器,解析响应结果为浏览器能识别的网页或者文件
  • ContentNegotiatingViewResolverSpringMVC 提供的视图内容协商器,根据响应视图类型来判断使用哪个解析器来解析,是使 SpringMVC 支持多视图解析器的重要组件,官方说明:https://spring.io/blog/2013/06/03/content-negotiation-using-views

0x1 一个请求过来

请求进入 DispactherServlet 会被分配给 doDispatch ,所以直接断点 doDispatch 即可

SpringMVC工作流程源码剖析

0x01 请求处理器

doDispatch 会匹配相应的 HandlerMapping (可以理解为你在 Controller 中写的方法),然后执行并拿到返回结果(也就是 ModelAndView)

SpringMVC工作流程源码剖析

0x02 视图解析器

DispactherServlet 会将ModelAndView交给 ViewResolvers(也就是常说的视图解析器) 解析处理。

ViewResolversContentNegotiatingViewResolver(详见 0x0 解释)它去问所有的视图解析器:这个 ModelAndView 你们能解析的了吗?,如下图:

类:ContentNegotiatingViewResolver
SpringMVC工作流程源码剖析

如何确定谁才是天选之子解析器?MediaType!按照顺序,第一个符合 MediaType 的解析器将被使用。

PS:比如你响应的是 text/html 文件,但是 text/html 解析器有两个,你想优先使用其中一个的话,你就得为该解析器设置 Order (详见 0x0 中官方说明)

SpringMVC工作流程源码剖析

SpringMVC工作流程源码剖析
得到 ModelView 以后,视图解析器的任务就算完成了

0x03 合并模板

下一步跳转到 视图处理

SpringMVC工作流程源码剖析

进入 render 方法后,会执行 Prepares the view given the specified model, merging it with static ,通俗讲就是将我们 Request 域或者 Session域 中的值(比如说请求参数回显)和视图解析出来的 ModelAndView 进行合并,这也是为什么我们再模板中可以轻松获得各种作用域值的原因,继续往下看

SpringMVC工作流程源码剖析

组装 ModelAndView

SpringMVC工作流程源码剖析

执行视图合并

SpringMVC工作流程源码剖析

SpringMVC工作流程源码剖析

获取模板文件和语言信息

SpringMVC工作流程源码剖析

ModelAndView 中的属性全部传递给 FreeMarker

SpringMVC工作流程源码剖析

最后一步生成 Html 并响应到浏览器

SpringMVC工作流程源码剖析

0x2 静态资源处理

SpringMVC 在视图处理器如果找不到合适的处理器的情况下,就会视该请求为静态资源请求并使用静态资源解析器解析该请求。

默认的静态资源目录如下,这也是为什么你将静态资源放在 resource 目录的时候不需要任何配置便可访问的原因

SpringMVC工作流程源码剖析

如果本文对你有帮助,欢迎关注并点赞~ 任何问题请评论区或者公众号留言。

关注本人公众号,收获双倍快乐

SpringMVC工作流程源码剖析

技术交流群,广告勿+

SpringMVC工作流程源码剖析

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136644.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • traceroute 命令使用方法详解

    traceroute 命令使用方法详解通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。linux系统中,我们称之为traceroute,在MSWindows中为tracert。traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)..

  • ubuntu18修改ssh端口(ssh 22端口拒绝)

    https://blog.csdn.net/md521/article/details/52597398

  • JavaScript中几种常用的设计模式

    JavaScript中几种常用的设计模式设计模式:代码书写经验,为了应对各种场景,经过前人不断的总结,压缩,形成的一套又一套的代码的书写规范,形成了设计模式。1.单例模式单例模式是一种常用的设计模式,如果需要多次创建同一个对象,完成

  • 肝了半个月,我整理出了这篇嵌入式开发学习学习路线+知识点梳理)「建议收藏」

    肝了半个月,我整理出了这篇嵌入式开发学习学习路线+知识点梳理)「建议收藏」不好意思久等了这篇文章让小伙伴们久等了。一年多以来,关于嵌入式开发学习路线、规划、看什么书等问题,被问得没有一百,也有大几十次了。但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思。但是办法总归是有的,正如前篇文章《最近厚着脸皮联系了不少老同学》所聊,虽然我自己不从事这些方向,但寻思了一下,我的同学和朋友中,多少还是有一些从事相关方向并且在一线(或曾在一线)工作过的,所以我就请他们帮忙一起梳理这几个我不熟悉领域的学习路线,这次嵌入式开发就是其中之一。这篇文章之所以拖这么久,因为沟..

  • 0703-APP-Notification-statue-bar

    0703-APP-Notification-statue-bar

    2021年11月23日
  • springboot启动后自动停止_redis启动停止重启

    springboot启动后自动停止_redis启动停止重启springboot项目启动后自动停止,也引入了jar包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>但是启动仍然自动停止,怎么搞?在启动类上增加捕获异常并打印日志publicstaticvoidmain(Strin

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号