笔记:pringMVC执行流程解析

来源:互联网 发布:青海藏语广播网络电视 编辑:程序博客网 时间:2024/06/07 17:23


图片来源于网络

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);}}}}




原创粉丝点击