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工作流程源码剖析

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm如何远程连接服务器_py服务端软件

    pycharm如何远程连接服务器_py服务端软件通过pycharm远程连接服务器首先确定你连接服务器的方式软件准备验证软件是否安装成功pycharm远程连接服务器上传自己的project到Ubuntu上传完以后,开始给自己的项目配置服务器的python解释器如何使用路由器,开启外网映射通过路由器的底部的网址进入管理员页面选择应用管理进入虚拟服务器在虚拟服务器中添加需要把内网映射到外网的IP地址查看自己映射出去的外网IP地址至此大功告成!!!您可以通过外网来访问您学校的服务器啦!首先确定你连接服务器的方式一般连接服务器需要服务器的ip地址,IP地址分为

    2022年8月28日
    0
  • layui table样式_layui table 分页

    layui table样式_layui table 分页table的结构:       序号   登录账号   用户名   权限   操作          ${(user.id)!”}   ${(user.userAccount!”)}   ${(user.userName!”)}   ${(user.

    2022年9月16日
    0
  • 移动app开发流程,app开发步骤

    移动app开发流程,app开发步骤个人github:https://github.com/qiilee 欢迎follow移动app开发流程,app开发步骤app是手机软件的简称。手机主流的有ios、andriod,windows平台。市场上程序做得比较多的也是前两款的平台。随着移动互联网的普及,移动终端功能的日益完善,很多企业看重移动互联网的重要,开始在这个领域完善自己的品牌,开展营销活动。一款好的app需要哪些…

    2022年6月9日
    45
  • 【10】进大厂必须掌握的面试题-版本控制面试

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 Q1。什么是版本控制? 这可能是您在面试中最容易遇到的问题。我的建议是首先给出版本控制的定义。它是一个记录一段时间内…

    2021年6月23日
    84
  • python按位取反_python赋值运算符

    python按位取反_python赋值运算符Python中的~(按位取反)运算的理解:按照我平时的理解,当我使用~按位取反运算的时候,计算机会将操作数所对应的二进制表达式的每一个位进行取反计算,取反后所得到的值就是~按位取反的运算结果(这点没问题)例如,假如我的计算机是32位的,我接下来要计算~5的值,计算过程如下:5的二进制表达式为:00000000000000000000000000000101执行~运算…

    2022年8月14日
    5
  • 20个最好的Rapidshare文件搜索引擎

    20个最好的Rapidshare文件搜索引擎20个最好的Rapidshare文件搜索引擎2008年06月21日星期六21:18经常需要检索外文文献或者外文资料的同学,应该都有使用rapidshare的经验,大家是如何在这个缺乏检索功能的网络硬盘站点中搜索想要的资料的呢?我想常用的无外乎两种:一则为通过google,输入关键名+rapidshare,看看会得到什么样的结果,这样往往需要我们在浩瀚的结果中人工查找一番才能有所收…

    2022年9月6日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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