org.springframework.web.servlet.DispatcherServlet protected void doDispatch(HttpServletRequest request, HttpServletResponse response)... { // processedRequest 为 org.apache.catalina.connector.RequestFacade HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = null; ... ModelAndView mv = null; // HandlerExecutionChain with [com.chaixy.common.controller.TestController#test()] and 2 interceptors mappedHandler = getHandler(processedRequest); ... // org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); ... // 没有页面跳转 mv=null mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); ... applyDefaultViewName(processedRequest, mv); mappedHandler.applyPostHandle(processedRequest, response, mv); ... } protected HandlerExecutionChain getHandler(HttpServletRequest request) { if (this.handlerMappings != null) { for (HandlerMapping mapping : this.handlerMappings) { // AbstractHandlerMapping HandlerExecutionChain handler = mapping.getHandler(request); if (handler != null) { return handler; } } } return null; } org.springframework.web.servlet.handler.AbstractHandlerMapping public final HandlerExecutionChain getHandler(HttpServletRequest request) { //com.chaixy.common.controller.TestController#test() Object handler = getHandlerInternal(request); ... HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request); ... return executionChain; } org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception { request.removeAttribute(PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE); try { return super.getHandlerInternal(request); } finally { ProducesRequestCondition.clearMediaTypesAttribute(request); } } org.springframework.web.servlet.handler.AbstractHandlerMethodMapping protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception { String lookupPath = getUrlPathHelper().getLookupPathForRequest(request); request.setAttribute(LOOKUP_PATH, lookupPath); this.mappingRegistry.acquireReadLock(); try { HandlerMethod handlerMethod = lookupHandlerMethod(lookupPath, request); return ... handlerMethod.createWithResolvedBean() ...; } finally { this.mappingRegistry.releaseReadLock(); } } protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) { List<Match> matches = new ArrayList<>(); List<T> directPathMatches = this.mappingRegistry.getMappingsByUrl(lookupPath); if (directPathMatches != null) { addMatchingMappings(directPathMatches, matches, request); } ... Match bestMatch = matches.get(0); ... request.setAttribute(BEST_MATCHING_HANDLER_ATTRIBUTE, bestMatch.handlerMethod); handleMatch(bestMatch.mapping, lookupPath, request); return bestMatch.handlerMethod; ... } public HandlerMethod createWithResolvedBean() { Object handler = this.bean; if (this.bean instanceof String) { Assert.state(this.beanFactory != null, "Cannot resolve bean name without BeanFactory"); String beanName = (String) this.bean; handler = this.beanFactory.getBean(beanName); } // this为com.chaixy.common.controller.TestController#test() // handler为com.chaixy.common.controller.TestController return new HandlerMethod(this, handler); } org.springframework.web.servlet.handler.AbstractHandlerMapping protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) { // handler --> HandlerMethod com.chaixy.common.controller.TestController#test() // 走new HandlerExecutionChain(handler)) HandlerExecutionChain chain = (handler instanceof HandlerExecutionChain ? (HandlerExecutionChain) handler : new HandlerExecutionChain(handler)); String lookupPath = this.urlPathHelper.getLookupPathForRequest(request, LOOKUP_PATH); for (HandlerInterceptor interceptor : this.adaptedInterceptors) { if (interceptor instanceof MappedInterceptor) { MappedInterceptor mappedInterceptor = (MappedInterceptor) interceptor; if (mappedInterceptor.matches(lookupPath, this.pathMatcher)) { chain.addInterceptor(mappedInterceptor.getInterceptor()); } } else { chain.addInterceptor(interceptor); } } // HandlerExecutionChain with [com.chaixy.common.controller.TestController#test()] and 2 interceptors return chain; } org.springframework.web.servlet.DispatcherServlet protected HandlerAdapter getHandlerAdapter(Object handler) { for (HandlerAdapter adapter : this.handlerAdapters) { if (adapter.supports(handler)) { // org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter return adapter; } } ... } org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter#supports public final boolean supports(Object handler) { return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler)); } org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#supportsInternal protected boolean supportsInternal(HandlerMethod handlerMethod) { return true; } org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter#handle public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) { return handleInternal(request, response, (HandlerMethod) handler); } org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#handleInternal protected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) { ModelAndView mav; ... mav = invokeHandlerMethod(request, response, handlerMethod); ... return mav; } protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception { ServletWebRequest webRequest = new ServletWebRequest(request, response); WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod); ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory); ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod); if (this.argumentResolvers != null) { invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers); } if (this.returnValueHandlers != null) { invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); } invocableMethod.setDataBinderFactory(binderFactory); invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer); ModelAndViewContainer mavContainer = new ModelAndViewContainer(); mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request)); modelFactory.initModel(webRequest, mavContainer, invocableMethod); mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect); AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response); asyncWebRequest.setTimeout(this.asyncRequestTimeout); WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); asyncManager.setTaskExecutor(this.taskExecutor); asyncManager.setAsyncWebRequest(asyncWebRequest); asyncManager.registerCallableInterceptors(this.callableInterceptors); asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors); if (asyncManager.hasConcurrentResult()) { Object result = asyncManager.getConcurrentResult(); mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0]; asyncManager.clearConcurrentResult(); LogFormatUtils.traceDebug(logger, traceOn -> { String formatted = LogFormatUtils.formatValue(result, !traceOn); return "Resume with async result [" + formatted + "]"; }); invocableMethod = invocableMethod.wrapConcurrentResult(result); } // 重要! 重要! 重要! 在这里反射调用Controller里面的业务代码 invocableMethod.invokeAndHandle(webRequest, mavContainer); return getModelAndView(mavContainer, modelFactory, webRequest); ... } private ModelAndView getModelAndView(ModelAndViewContainer mavContainer, ModelFactory modelFactory, NativeWebRequest webRequest) { modelFactory.updateModel(webRequest, mavContainer); if (mavContainer.isRequestHandled()) { // 直接返回null return null; } ModelMap model = mavContainer.getModel(); ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model, mavContainer.getStatus()); if (!mavContainer.isViewReference()) { mav.setView((View) mavContainer.getView()); } if (model instanceof RedirectAttributes) { Map<String, ?> flashAttributes = ((RedirectAttributes) model).getFlashAttributes(); HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); if (request != null) { RequestContextUtils.getOutputFlashMap(request).putAll(flashAttributes); } } return mav; }
标签:...,return,SpringMVC,流程,request,mavContainer,handler,HandlerMethod,代码 From: https://www.cnblogs.com/dzpykj/p/17466992.html