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,初始化时会将urlpath做映射存储;
第二个是RequestMappingHandlerMapping,初始化时会将Controller中配置@RequestMapping注解的方法做映射存储。
看源码:
存:

取:

可以看出,HandlerMapping初始化时,会将映射与handler存储到map里;处理请求时,从map里取出对应的处理handler。
这就是HandlerMapping在springmvc里的大致处理流程,还有很多代码细节需要进一步研究。
接下来将会对HandlerAdapter进行分析

springmvcHandlerMapping解析相关推荐

  1. springmvcHandlerMapping解析_晏无心_新浪博客

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

  2. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  3. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  4. 条形码?二维码?生成、解析都在这里!

    二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...

  5. Go 学习笔记(82)— Go 第三方库之 viper(解析配置文件、热更新配置文件)

    1. viper 特点 viper 是一个完整的 Go应用程序的配置解决方案,它被设计为在应用程序中工作,并能处理所有类型的配置需求和格式.支持特性功能如下: 设置默认值 读取 JSON.TOML.Y ...

  6. Go 学习笔记(77)— Go 第三方库之 cronexpr(解析 crontab 表达式,定时任务)

    cronexpr 支持的比 Linux 自身的 crontab 更详细,可以精确到秒级别. ​ 1. 实现方式 cronexpr 表达式从前到后的顺序如下所示: 字段类型 是否为必须字段 允许的值 允 ...

  7. mybatis配置文件解析

    mybatis配置文件解析 mybatis核心配置文件`mybatis-config.xml文件. mybatis的配置文件包含了会深深影响mybatis行为的设置和属性信息. 能配置的内容: con ...

  8. 谷歌BERT预训练源码解析(二):模型构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...

  9. Python 标准库之 xml.etree.ElementTree xml解析

    Python 标准库之 xml.etree.ElementTree Python中有多种xml处理API,常用的有xml.dom.*模块.xml.sax.*模块.xml.parser.expat模块和 ...

最新文章

  1. python面试常见问题-Python面试中常见的40个问题
  2. 河北计算机辅助普通话试题,115-河北省计算机辅助普通话水平测试培训.pptx
  3. Zjoi2010排列计数Perm
  4. 服务器数据库怎么添加计划维护,服务器数据库怎么添加计划维护
  5. linux网络编程之posix 线程(四):posix 条件变量与互斥锁 示例生产者--消费者问题
  6. Vue框架之条件与循环的使用
  7. Projection投影
  8. python动态与静态语言_静态语言和动态语言的区别
  9. PLC与常用设备的连接
  10. TCP/IP学习笔记12-- IP协议基础
  11. Webrtc demo system
  12. win7电脑桌面便签哪个好用
  13. OMS智能订单管理系统
  14. mysql数据库设计与优化与架构 模拟场景(京东商城)
  15. 【技术贴】从51下载的网站代码asp源码怎么运行?怎么打开?
  16. Git三大特色之Stage(暂存区)--留着当资料
  17. excel取消合并单元格并填充内容的技巧
  18. nali for win golang版, 显示ip 的小工具
  19. 母亲节海报太暖心,速来围观打卡吧~
  20. Codeforces 950C-Zebras(模拟构造)

热门文章

  1. c++实现sqrt函数功能
  2. itext 简介、中文文档、中英对照文档 下载
  3. Linux 强制破解root密码 是root密码哦
  4. 使用WireMock快速伪造RESTful服务
  5. HTML5Canvas绘图(上)
  6. 机器人中的数值优化|【一】数值优化基础
  7. 机器人误差动力学与PID控制
  8. [蓝桥杯2020初赛] 成绩统计
  9. markdown图片左对齐问题
  10. Python 练习实例03:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?