首页 > 代码库 > SpringMvc 大概流程分析

SpringMvc 大概流程分析

DispatcherServlet的核心方法     doDispatch

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {		HttpServletRequest processedRequest = request;		HandlerExecutionChain mappedHandler = null;		int interceptorIndex = -1;		try {			ModelAndView mv;			boolean errorView = false;			try {				processedRequest = checkMultipart(request);				// Determine handler for the current request.				mappedHandler = getHandler(processedRequest, false);				if (mappedHandler == null || mappedHandler.getHandler() == null) {					noHandlerFound(processedRequest, response);					return;				}				// Determine handler adapter for the current request.				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()) {						String requestUri = urlPathHelper.getRequestUri(request);						logger.debug("Last-Modified value for [" + requestUri + "] is: " + lastModified);					}					if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {						return;					}				}				// Apply preHandle methods of registered interceptors.				HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();				if (interceptors != null) {					for (int i = 0; i < interceptors.length; i++) {						HandlerInterceptor interceptor = interceptors[i];						if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) {							triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);							return;						}						interceptorIndex = i;					}				}				// Actually invoke the handler.				mv = ha.handle(processedRequest, response, mappedHandler.getHandler());				// Do we need view name translation?				if (mv != null && !mv.hasView()) {					mv.setViewName(getDefaultViewName(request));				}				// Apply postHandle methods of registered interceptors.				if (interceptors != null) {					for (int i = interceptors.length - 1; i >= 0; i--) {						HandlerInterceptor interceptor = interceptors[i];						interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv);					}				}			}			catch (ModelAndViewDefiningException ex) {				logger.debug("ModelAndViewDefiningException encountered", ex);				mv = ex.getModelAndView();			}			catch (Exception ex) {				Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);				mv = processHandlerException(processedRequest, response, handler, ex);				errorView = (mv != null);			}			// Did the handler return a view to render?			if (mv != null && !mv.wasCleared()) {				render(mv, processedRequest, response);				if (errorView) {					WebUtils.clearErrorRequestAttributes(request);				}			}			else {				if (logger.isDebugEnabled()) {					logger.debug("Null ModelAndView returned to DispatcherServlet with name ‘" + getServletName() +							"‘: assuming HandlerAdapter completed request handling");				}			}			// Trigger after-completion for successful outcome.			triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);		}		catch (Exception ex) {			// Trigger after-completion for thrown exception.			triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);			throw ex;		}		catch (Error err) {			ServletException ex = new NestedServletException("Handler processing failed", err);			// Trigger after-completion for thrown exception.			triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);			throw ex;		}		finally {			// Clean up any resources used by a multipart request.			if (processedRequest != request) {				cleanupMultipart(processedRequest);			}		}	}

从上面方法开始分析:

     SpringMvc通过一个 DispatcherServlet  Servlet对指定的URL进行处理, 当处理某个请求url时 DispatcherServlet  会迭代所有的 HandlerMapping  

即上述代码中的 

  mappedHandler = getHandler(processedRequest, false);
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {		for (HandlerMapping hm : this.handlerMappings) {			if (logger.isTraceEnabled()) {				logger.trace(						"Testing handler map [" + hm + "] in DispatcherServlet with name ‘" + getServletName() + "‘");			}			HandlerExecutionChain handler = hm.getHandler(request);			if (handler != null) {				return handler;			}		}		return null;	}

  从上面代码可以获知:迭代所有的 HandlerMapping当找到合适的立刻返回,返回的对象为   HandlerExecutionChain ,

HandlerExecutionChain 对象中包含了映射到的Controller和一些 Intetceptor(拦截器).然后通过
HandlerExecutionChain 中的 getHandler()即Controller获取对应到 HandlerAdapter()
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 
HandlerAdapter中包含了很多的处理 ,如参数解析(用户可以自己实现参数解析) 数据绑定信息
在调用
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());方法中间包含了 迭代
HandlerExecutionChain 中的所有拦截器 ,
HandlerAdapter的
handle将调用目标Controler方法并返回对应到视图

 

SpringMvc 大概流程分析