spring boot2 (五)web中请求映射原理

因为web的知识点比较多,所以我这里分开整理。这章主要说请求映射的原理。

关于请求,就不从http协议,tcp/ip协议啥的开始说了。这里只说spring boot对请求的处理,简单说几句:spring boot底层是spring mvc。 而spring mvc中是用DispatcherServlet.所以哪怕是spring boot,我们也应该从这个类开始看(其实根据我们最开始手撸servlet的时候应该记得那时候的实现方式是继承HttpServlet。选择继承doGet,doPost方法)
下面开始源码分析之路:
首先要找到这个映射配置
第一步找到这个DispatcherServlet。并打开这个继承树:


继承关系

如图,我们熟悉的HttpServlet在上面,这个DispatcherServlet中间隔了一个。但是注意我们知道重点的请求处理方法就是这个doGet和doPost。所以找到这两个方法:
事实证明DispatcherServlet是没这两个方法的,所以我们往上一层一层的找(我这里就是点进父类直接搜doGet。)
不用一层一层了,直接在DispatcherServlet的父类FrameworkServlet中就找到了它重写的doGet/doPost方法了。下面我们看重写成什么样子了:


重写doGet/doPost

你说巧不巧,这俩方法重写后是一个方法,我们再点进去瞅瞅:


processRequest方法

其实这个点进去了就发现,前面一大堆get.就是获取什么属性,处理请求之类的,但是其具体的逻辑还是在黄色框起来的地方,所以还是要进入doService方法。(关于前面那个get代码,我们可以在这里打个断点一会看看这个get都是什么玩意)
这里我们会发现父类的这个方法只是接口,实现又回到了DispatcherServlet了。如下代码:


doService方法

这个截图没截下,其实前面get/set半天,最终又进入了一个方法:
doDispatch方法

然后我们继续往下走:


最终请求

到这个方法总算是到头了,所以总结一点:想分析spring mvc中请求映射原理,从DispatcherServlet类中的doDispatch方法开始分析。下面开始断点调试,分析请求映射原理:
暂时为了明确, 我只在doDispatch方法上打断点,然后debug启动访问接口:

直接进到这个断点,然后一点点调试

注意,这个时候我们看这个request信息,如下截图(我这边的请求是http://localhost:1234/imgs/1.png):
请求路径

然后我们往下走代码,这里有一些空值变量先不管,还有判断是不是文件,检查是不是文件啥的也先别管,因为我这里是一个正常的接口访问。所以接下来要走到的一行代码是带着注释的那行:

                // Determine handler for the current request.
                mappedHandler = getHandler(processedRequest);

这个注释翻译过来是确定当前请求的处理程序。
然后我们走进这个方法:

getHandler

这个方法中有个属性:handlerMappings
我们可以查看一下里面是什么东西:
其有默认的五个处理器。而且看上去很眼熟

这五个一眼就能看懂的也就欢迎页处理器了,当然了那个beanNameUrl的拆开来每个单词也都认识。
其实这个五个处理器中,第一个RequestMappingHandlerMapping我们也应该眼熟,因为我们以前常用的一个注解@RequestMapping(xxxx).
而且这个处理器就是用来处理所有这个注解标注的方法和其对应的映射规则。
方法和url关联到一起

回到刚刚的话题,这个getHandler方法就是把访问的路径和所有的处理器去一一比对,然后这也解释了昨天说的, 为什么一个静态资源和一个接口的url一致时,会返回接口的结果而不是访问静态资源!
而这些处理器中,则是kv对的形式把路径和方法一一对应保存了,如下截图:


处理器中保存所有的路径和方法

这里有一点要注意的,其实请求方式+请求路径 才是一个完整的key。所以同样路径不同方式是可以写多个的(比如restful风格的/user包括crud)。但是同样路径的同样请求只能写一个!不然就会报错。因为key唯一?(注意我这里说的是完整路径。/base下有个/user./app下有个/user就没问题)。
而我们spring boot做了什么呢?给我们自动配置了welcomeHandlerMapping和RequestMappingHandlerMapping


spring boot自动配置了两个处理器

到这里,spring boot的请求映射原理就差不多整理完了。
本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利!生命不息,学习不止。我们一起加油!

你可能感兴趣的:(spring boot2 (五)web中请求映射原理)