SpringMVC核心处理流程梳理

1、处理流程图展示

当我拿出这张图,阁下又该如何应对呢?执行流程是不是一目了然了。
SpringMVC核心处理流程梳理_第1张图片

2、DispatcherServlet:中央处理器或者中央调度器

SpringMVC核心处理流程梳理_第2张图片

下图官方的解释应该最完善了。
SpringMVC核心处理流程梳理_第3张图片

3、SpringMVC三大核心组件

  • HandlerMapping
    处理器映射器,作用是解析URL,返回执行链以及一些列所需的拦截器(DispatcherServlet源代码1030行的doDispatch(HttpServletRequest request, HttpServletResponse response)方法里面清晰地展示了执行流程,大家有兴趣了可以去看看,就是一个方法套方法的执行链条,最终将请求进行处理,直到返回ModelAndView。)
/**
	 * Process the actual dispatching to the handler.
	 * 

The handler will be obtained by applying the servlet's HandlerMappings in order. * The HandlerAdapter will be obtained by querying the servlet's installed HandlerAdapters * to find the first that supports the handler class. *

All HTTP methods are handled by this method. It's up to HandlerAdapters or handlers * themselves to decide which methods are acceptable. * @param request current HTTP request * @param response current HTTP response * @throws Exception in case of any kind of processing failure */ @SuppressWarnings("deprecation") // 最核心的请求、响应处理方法 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); // 传递请求,最终初始化处理器映射器 mappedHandler = getHandler(processedRequest); if (mappedHandler == null) { noHandlerFound(processedRequest, response); return; } // 根据前面的处理器映射器初始化处理器适配器 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); // 拿到请求方式 String method = request.getMethod(); //是否是GET请求 boolean isGet = HttpMethod.GET.matches(method); if (isGet || HttpMethod.HEAD.matches(method)) { long lastModified = ha.getLastModified(request, mappedHandler.getHandler()); if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) { return; } } if (!mappedHandler.applyPreHandle(processedRequest, response)) { return; } // 真正的处理请求,并返回模型和视图 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); if (asyncManager.isConcurrentHandlingStarted()) { return; } applyDefaultViewName(processedRequest, mv); mappedHandler.applyPostHandle(processedRequest, response, mv); } catch (Exception ex) { dispatchException = ex; } catch (Throwable err) { // As of 4.3, we're processing Errors thrown from handler methods as well, // making them available for @ExceptionHandler methods and other scenarios. dispatchException = new NestedServletException("Handler dispatch failed", err); } // 封装视图结果 processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); } catch (Exception ex) { triggerAfterCompletion(processedRequest, response, mappedHandler, ex); } catch (Throwable err) { triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", err)); } finally { if (asyncManager.isConcurrentHandlingStarted()) { // Instead of postHandle and afterCompletion if (mappedHandler != null) { mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response); } } else { // Clean up any resources used by a multipart request. if (multipartRequestParsed) { cleanupMultipart(processedRequest); } } } }

  • HandlerAdapter

    处理器适配器
    SpringMVC核心处理流程梳理_第4张图片
    SpringMVC核心处理流程梳理_第5张图片

  • ViewResolver

    视图解析器

你可能感兴趣的:(springMVC,spring,springmvc执行流程,java)