一、DispatcherServlet的继承关系
1、FrameworkServlet
HttpServlet中的doGet等方法在FrameworkServlet之中重写了,都是调用该方法:
在这个方法内部调用doServlce的方法
这个doService的方法在FrameworkServlet中是一个抽象方法,说明是交给它的子类去重写的即就是DispatcherServlet。
2、DispathcerServlet
这也是SpringMVC的核心组件,用来处理请求,重写(实现了)doService方法。
在doService方法中,最核心的是调用doDispatch来做转发等操作。
2.1 doDispatch
随便写了个控制器测试 :
当发送/car请求时候,在doDispatch中获取到请求
在request变量中就有请求路径。
之后执行到这一步:
在这一步执行完之后就找到了所对应的控制器及上面的 Car() 方法。
2.2 mappedHandler的确定
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中的方法。