笔记:pringMVC执行流程解析
2017-10-22 15:28
267 查看
图片来源于网络
1、DispatcherServlet 中央调度器(主要职责就是任务调度,在servlet容器)
<!--使用Spring MVC,配置DispatcherServlet是第一步。DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet--> <!--DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。--> <servlet> <!--在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean。--> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--指明了配置文件的文件名,不使用默认配置文件名,而使用dispatcher-servlet.xml配置文件。--> <init-param> <param-name>contextConfigLocation</param-name> <!--其中<param-value>**.xml</param-value> 这里可以使用多种写法--> <!--1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml--> <!--2、<param-value>/WEB-INF/classes/dispatcher-servlet.xml</param-value>--> <!--3、<param-value>classpath*:dispatcher-servlet.xml</param-value>--> <!--4、多个值用逗号分隔--> <param-value>classpath:springmvc/spring-mvc.xml</param-value> </init-param> <!--是启动顺序,让这个Servlet随Servletp容器一起启动。--> <load-on-startup>1</load-on-startup> </servlet>
2、HandlerMapping 处理器映射器
请求和负责处理请求方法之间的对应关系的一个映射关系
3、HandlerAdaptor 处理器适配器
HandlerAdapter【HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,SimpleServletHandlerAdapter,AnnotationMethodHandlerAdapter 】
实际调用处理函数,获得一个ModelAndView。
4、Controller 处理器
处理请求
5、ViewResolver 视图解析器
视图解析
6、View 视图
返回的数据
DispatchServlet中核心代码:
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); /**** * 1、 HandleMapping 返回一个处理器执行链 */ mappedHandler = getHandler(processedRequest); if (mappedHandler == null || mappedHandler.getHandler() == null) { noHandlerFound(processedRequest, response); return; } /**** * 2、获取HandleAdapter 处理器适配器 */ 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; } /**** * 3、HandleAdapter 调用具体处理器方法,返回一个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); } /**** * 4、解析渲染视图 */ 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()) { if (mappedHandler != null) { mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response); } } else { if (multipartRequestParsed) { cleanupMultipart(processedRequest); } } } }
相关文章推荐
- Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程
- Java学习笔记4-控制执行流程
- Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程
- Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程
- (传智博客)tp开发第一天之tp执行流程分析笔记
- 控制执行流程——(Java学习笔记三)
- Flask源码解析:Flask应用执行流程及原理
- cocos2d笔记 (2)解析cocos2d项目整体框架和启动流程
- SpringMVC执行流程及源码解析
- C++ primer (5th) 随想与学习笔记 7 执行流程永不变 新标准添精彩
- 读thinking in java笔记(三):控制执行流程
- Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程
- thinking in java笔记 4 控制执行流程
- Hadoop MapReduce 任务执行流程源代码详细解析(转载)
- thinking in java 笔记 思维导图 第四章 控制执行流程
- 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序
- 【原创】angularjs1.3.0源码解析之执行流程
- SPRING IN ACTION 第4版笔记-第八章Advanced Spring MVC-006-Pizza例子的支付流程
- 图文解析Struts2框架执行流程