请求映射的原理
首先我们要找到DispatcherServlet这个类,因为所有的请求都是由这个类进行处理的。
打开DispatcherServlet的继承树。
从继承树上我们看到看到,DispatcherServlet同样是一个servlet。我们知道servlet首先调用的是doGet方法。
在httpservlet中没有找到doGet()方法,这是因为FrameworkServlet这个类重写了doGet方法。
在doGet方法中,首先调用了processRequest()方法,然后进行了一些初始化的操作,再然后,便是调用了doService方法。
因为DispatchServlet重写继承了FrameworkServlet这个类,并且重新写了其中的doService方法,因此调用的是DispatchServlet中的doService方法。
然后对请求增加了一些参数,执行了doDispatch()方法。
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
// 找到当前请求使用哪个Handler(Controller的方法)处理
mappedHandler = getHandler(processedRequest);
//HandlerMapping:处理器映射。/xxx->>xxxx
mappedHandler = getHandler(processedRequest)
这个方法是看现在的请求需要哪个Handler处理(Controller的方法),得到处理器映射器。
一共有5个HandlerMaping。RequestMappingHandlerMapping:保存了所有@RequestMapping 和handler的映射规则。
所有的请求映射都在HandlerMapping中。
• SpringBoot自动配置欢迎页的 WelcomePageHandlerMapping 。访问 /能访问到index.html;
• SpringBoot自动配置了默认 的 RequestMappingHandlerMapping
• 请求进来,挨个尝试所有的HandlerMapping看是否有请求信息。
• 如果有就找到这个请求对应的handler
• 如果没有就是下一个 HandlerMapping