springmvc对所有的请求流程都交给了dispatcherServlet,而DispatcherServlet继承了FrameworkServlet,具体的类图关系有:

Springmvc 源码解读(一)

处理流程图:

Springmvc 源码解读(一) 

UML序列图:

Springmvc 源码解读(一) 

具体解析:

 1、所有的请求会被doService()方法接管,

protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception{}

首先会把request中的attribute提取出来,避免在处理中被丢掉。设置根上下文WebApplicationContext属性等。

2、getHandlerMapping()返回HandlerMapping

3、HandlerMapping.getHander()方法返回HandlerExecutionChain

4、getHandlerAdapter()方法返回HandlerAdapter

5、调用preHandle()方法做拦截器前置处理

6、Handler.handle()处理ModelAndView

7、拦截器PostHandle处理

8、render()渲染view

具体的源码有:

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 {
            // 检查是否有multipart resolver
			processedRequest = checkMultipart(request);
			multipartRequestParsed = (processedRequest != request);

			// 获取handlerMapping后,并获取handlerMapping处理后的执行链
			mappedHandler = getHandler(processedRequest);
			if (mappedHandler == null) {
				noHandlerFound(processedRequest, response);
				return;
			}

			// 确定HandlerAdapter
			HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

			// Process last-modified header, if supported by the handler.
			String method = request.getMethod();
			boolean isGet = "GET".equals(method);
			if (isGet || "HEAD".equals(method)) {
				long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
				if (logger.isDebugEnabled()) {
					logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);
				}
				if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
					return;
				}
			}

            // 拦截器前置处理
			if (!mappedHandler.applyPreHandle(processedRequest, response)) {
				return;
			}

			// Handler处理,返回ModelAndView
			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) {
			// 直接抛出异常
			dispatchException = new NestedServletException("Handler dispatch failed", err);
		}
        // 渲染view
		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);
				}
			}
		}
	}

参考来自:http://www.iocoder.cn/Spring-MVC/good-collection/?title

相关文章:

  • 2021-09-20
  • 2021-07-02
  • 2022-01-06
  • 2022-03-06
  • 2021-06-01
  • 2022-01-18
  • 2021-12-25
  • 2021-12-07
猜你喜欢
  • 2021-06-17
  • 2022-01-23
  • 2022-12-23
  • 2021-09-07
  • 2021-04-30
  • 2022-02-08
  • 2021-05-19
相关资源
相似解决方案