请求所使用的类:DispatcherServlet
继承树
以用户get请求为例:当用户请求的时候,进入DispatcherServlet,通过继承树的分析,可以得到他是继承HttpServlet,因此就会重写doGet方法,通过查询得到,FrameworkServlet中有重写doGET方法
从doGet方法中看到,执行了processRequest(request, response)方法,其中核心部分是doService方法
由于,FrameworkServlet中只定义了他为一个抽象方法,因此DispatcherServlet中对该方法进行了重写
其中核心方法是:doDispatch(request, response);
进入到doDispatch(request, response)方法中。其中mappedHandler = getHandler(processedRequest);为核心
在断点中可以看到,其中有5个handlerMapping,这些handlerMapping都是在项目其中的时候,自动注入到容器中,其中requestMappingHandlerMapping代表的就是,只用注解requestMapping()的那些方法,都会放在这个集合里面,另外加上系统自带的error方法
在getHandler(processedRequest)方法中,遍历循环5个mapping,然后将用户请求的request分别和他们匹配,若是匹配上了,则放回,并且执行该匹配上的方法,进行下一步执行。
匹配详解
进入到HandlerExecutionChain handler = mapping.getHandler(request)中,
第一个先进入,requestMappingHandlerMapping中,
首先获取请求的url,然后在执行lookupHandlerMethod(lookupPath, request),进行去匹配
从图中可以看到,uri 是/user
这边自己测试写的注解注解种,其中user的有四个,分别为post,get,put,delete,这边通过
/user去匹配,最后匹配到了四个,
接下去做下一步判断,若是存在则执行addMatchingMappings(directPathMatches, matches, request);方法。
图中可以看到,其中directPathMatches 则为/user匹配得到的一个arrayList,matches则为空List,以及用户请求的request参数
通过代码分析,可以得到,for循环,directPathMatches,然后获取到每一个mapping中的请求方式如(get,post,put,delete)进行和request.getMethod()进行匹配,若是匹配上了,则添加到matches列表中,否则继续循环,若是requestMappingHandlerMapping中没有匹配到,则继续循环下一个handlerMapping,然后继续在handlerMapping进行进一步的匹配。
最后,若是匹配到了,就执行找到的方法。
网友评论