SpringMVC核心处理流程梳理

发布时间:2023年12月25日

1、处理流程图展示

当我拿出这张图,阁下又该如何应对呢?执行流程是不是一目了然了。
在这里插入图片描述

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

在这里插入图片描述

下图官方的解释应该最完善了。
在这里插入图片描述

3、SpringMVC三大核心组件

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

    处理器适配器
    在这里插入图片描述
    在这里插入图片描述

  • ViewResolver

    视图解析器

文章来源:https://blog.csdn.net/qq_35543206/article/details/135188366
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。