SpringMvc中DispatchServlet是处理所有请求的开始,
frameworkServlet重写了doGet方法,最终会调用到 frameworkServlet的doGet
进入processRequest方法内,前面是初始化过程,核心是doService(request,reponse)
由于doService点进去是抽象方法,自然进入子类DispatcherServlet,最终在DispatcherServlet实现了doService
其中核心的方法时doDispatch(request,response) ,最终每个请求进来都会调用这个方法
即SpringMVC功能分析都从 org.springframework.web.servlet.DispatcherServlet-》doDispatch
核心在于
mappedHandler = getHandler(processedRequest);
我们需要知道它到底是怎么找到当前/user请求会调用哪个方法
HandlerMapping:处理器映射
进入方法,发现有 5个处理器映射,
RequestMappingHandlerMapping:保存了所有@RequestMapping 和handler的映射规则
打开后发现里面有我们在controller写的各种请求,在这里面寻找
进入getHandler方法,
进入getHandlerInternal
先拿到我们原生请求的路径,然后还拿到一把锁,害怕并发查询,mappingRegistry上面已经说了,
进入lookupHandlerMethod,第一个参数是我们的请求路径,第二个是原生request
从mappingRegistry寻找谁能处理,先是根据请求路径找,最终找到4个,
将找到的添加到我们的请求集合里面
在里面找到最佳匹配的路径
为空的情况
不为空时获取第一个,如果数量大于1,经过一系列操作,最终报错
Ambiguous handler methods mapped for '" + uri + "': {" + m1 + ", " + m2 + "}"
也就是SpringMvc要求我们同样的请求路径,请求方式只能有一个
---------------------------------------------------------------------------------------------------------------------------
欢迎页的访问
请求进来,挨个尝试所有的HandlerMapping看是否有请求信息。
如果有就找到这个请求对应的handler,如果没有就是下一个 HandlerMapping
SpringBoot自动配置欢迎页的 WelcomePageHandlerMapping 。访问 /能访问到index.html;
SpringBoot自动配置了默认 的 RequestMappingHandlerMapping
还有后面三个
------------------------------------------------------------------------------------------------------------------------
我们需要一些自定义的映射处理,我们也可以自己给容器中放HandlerMapping。自定义 HandlerMapping



