Spingmvc中的HandlerMapping负责解析请求URL,对应到Handler进行处理(这里的Handler一般为Controller里的一个方法method,也可以为servlet或者Controller等)

先来看一个http请求的入口DispatcherServlet:


DispatcherServlet继承FrameworkServlet,FrameworkServlet继承HttpServletBean,HttpServletBean继承HttpServlet。

可以看出,springmvc的DispatcherServlet是在Servelt的基础上做了扩展处理。


doService方法为servlet处理请求的入口,DispatcherServlet中做了方法覆盖,doService方法中的doDispatch(request, response)方法,是springmvc处理整个请求流程的关键。


mappedHandler = getHandler(processedRequest);
这行代码实现了为请求寻找处理handler,返回的是HandlerExecutionChain;
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
找到处理handler后,再去找匹配的HandlerAdapter,HandlerAdapter将完成后续处理。
继续看是如何找到请求对应的处理handler的:

可以看出是从类变量this.handlerMappings中循环获取,当找到与之匹配的HandlerMapping时,返回类型为HandlerExecutionChain的handler。
这里this.handlerMappings中的值是从哪获取的呢?DispatcherServlet初始化的时候会给this.handlerMappings赋值:


从这里可以看出,在servlet初始化的时候,会对springmvc的HandlerMappings、HandlerAdapters等做初始化。


这里三个步骤,先对springmvc.xml里配置的HandlerMapping进行初始化、实例化,再对this.handlerMappings赋值,最后对this.handlerMappings进行排序。
这里的排序就是对HandlerMapping的order属性进行排序,这样,order属性值小的,就可以先对请求进行匹配。
从tomcat启动日志里可以看到HandlerMapping的初始化:

这里涉及到两个HandlerMapping:
第一个是BeanNameUrlHandlerMapping,初始化时会将url path做映射存储;
第二个是RequestMappingHandlerMapping,初始化时会将Controller中配置@RequestMapping注解的方法做映射存储。


可以看出,HandlerMapping初始化时,会将映射与handler存储到map里;处理请求时,从map里取出对应的处理handler。

这就是HandlerMapping在springmvc里的大致处理流程,还有很多代码细节需要进一步研究。
接下来将会对HandlerAdapter进行分析

springmvcHandlerMapping解析_晏无心_新浪博客相关推荐

  1. 2.2.2 胸腰差和胸臀差的应用_米人NOONE_新浪博客

    2.2.2 胸腰差和胸臀差的应用_米人NOONE_新浪博客 2.2.2  胸腰差和胸臀差的应用_米人NOONE_新浪博客 腰差和胸臀差的应用 (2009-06-16 19:24:57) 转载▼ 标签: ...

  2. ArcGIS MPK的两种打包方式_陈焜浩Arain_新浪博客

    最近发现用ArcGIS打包的MPK文件,如果数据的来源不一样:从shapefile源数据或者是从SDE源数据进行打包,能够引起打包文件的大小不一样已经在代码中引用文件的效率不一样的差异.开始发现这种差 ...

  3. MODIS MOD11A2地温产品_江仔91_新浪博客

    注意事项: 1.经MRT转换后的数据需要进一步处理,如:LST产品需经公式:NG*0.02-273.15运算后才可转换为设施温度.​

  4. 邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客

    邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客 邓文迪撑杆跳,甩开老公要独立? (2010-01-11 10:55:22) 转载▼

  5. cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客

    cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客 Cadence Allegro16.5详细安装具体的步骤 1.下载SPB16.5下来后,点setup.exe,先安装第一项 ...

  6. 关于幂律分布的一个笔记_哈克_新浪博客

    关于幂律分布的一个笔记_哈克_新浪博客 关于幂律分布的一个笔记     (2011-03-02 18:12:27)     转载▼     标签:     幂律     二八法则     杂谈     ...

  7. vim高级技巧(split)_小花_新浪博客

    vim高级技巧(split)_小花_新浪博客    :res(ize) +N 把当前窗口高度增加N个像素    :res(ize) -N 把当前窗口高度减少N个像素    :vertical res( ...

  8. 基于samba实现win7与linux之间共享文件_阳仔_新浪博客

    基于samba实现win7与linux之间共享文件_阳仔_新浪博客 然后启动samba执行如下指令: /dev/init.d/smb start 至此完成全部配置.

  9. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客

    Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客 Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf     (2009-07- ...

  10. 中国游客是否可以持中国驾照在美国自驾游?_游侠_新浪博客

    中国游客是否可以持中国驾照在美国自驾游?_游侠_新浪博客 中国游客是否可以持中国驾照在美国自驾游?

最新文章

  1. php环境搭建 warmp_PHP环境搭建
  2. 使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)--转载...
  3. 主数据管理(MDM)的七个最佳实践
  4. Python--12 内嵌函数和闭包
  5. USACO1.5 Number Triangles(numtri)
  6. 20172317 2018-2019-1 《程序设计与数据结构》 第五周学习总结
  7. python3编码声明_python3编码问题汇总
  8. java高校职工工资管理论文_毕业设计论文java大学工资管理系统
  9. 代码之美——Doom3源代码赏析
  10. 帆软发布大数据直连引擎FineDirect,对焦大数据BI
  11. Excel 关于新建xls文件 新建sheet 合并sheet的VBA操作代码
  12. queue初始化java,如何在java中实例化一个Queue对象?
  13. mysql中log_mysql中log
  14. 基于51单片机+SG90舵机
  15. Android 去除各种厂家广告合集
  16. android降低屏幕分辨率,让游戏更尽兴 手动调低Android手机屏幕分辨率
  17. 最新好看的自适应手机版软件APP下载类网站源码,游戏软件应用网站源码,自适应手机端Pbootcms模板
  18. 猿辅导-2019-校招笔试
  19. 我的Go+语言初体验——基于CentOS系统搭建Go+语言环境详细教程
  20. UDP与TCP协议详解

热门文章

  1. linux中setfacl命令,Linux命令之:setfacl和getfacl
  2. 皇室战争服务器维护是干什么的,皇室战争冷知识 玩了这么久你究竟学到了什么...
  3. slf4j,log4j,log back之间的关系和区别
  4. 【贪玩巴斯】带你学:C++ tips ——知识点:string::npos 用法详细解析 , 看这一篇就够了 2021年12月21日
  5. UCKeFU v2.0正式版驾到,智能客服系统新选择
  6. linux自动登录cmcc脚本,Linux下移动CMCC WLAN自动连接认证
  7. 基于SSM框架的疫情防控管理系统设计与实现.rar(论文+项目源码)
  8. java nashorn_Java编程Nashorn实例代码
  9. 仿李白写一首关于雪的诗
  10. Flink Checkpoint所有配置解读