
HttpServlet中的doGet等方法在FrameworkServlet之中重写了,都是调用该方法:

在这个方法内部调用doServlce的方法

这个doService的方法在FrameworkServlet中是一个抽象方法,说明是交给它的子类去重写的即就是DispatcherServlet。
这也是SpringMVC的核心组件,用来处理请求,重写(实现了)doService方法。

在doService方法中,最核心的是调用doDispatch来做转发等操作。

随便写了个控制器测试 :

当发送/car请求时候,在doDispatch中获取到请求

在request变量中就有请求路径。

之后执行到这一步:
在这一步执行完之后就找到了所对应的控制器及上面的 Car() 方法。
this.getHandler方法:
- @Nullable
- protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
- if (this.handlerMappings != null) {
- Iterator var2 = this.handlerMappings.iterator();
-
- while(var2.hasNext()) {
- HandlerMapping mapping = (HandlerMapping)var2.next();
- HandlerExecutionChain handler = mapping.getHandler(request);
- if (handler != null) {
- return handler;
- }
- }
- }
其中handlerMappings初始就有5个:

主要的目的就是 在这五种类型的处理器选取能够匹配当前请求的handler。
spring中的web项目启动的过程中MVC就会扫描所有的Controller并且解析其中的注解,全部保存到handlerMappings中。

执行完这行代码后可以在 mapping变量中的看到:

说明标注注解@RequestMapping的方法都已经被注册了。
之后SpringMVC经过对比找到了请求路径为/car的控制器及其方法,之后返回handler即可。
HandlerExecutionChain handler = mapping.getHandler(request);
确定handler的过程:首先是匹配url,比如有好几个/car的请求路径但是方法不同。
然后再一个一个确认请求方法,最终返回所对应的handler。也就是mapping,getHandler中的方法。