zoukankan      html  css  js  c++  java
  • 浅谈SpringMVC

    在面试的时候,面试官经常会问你对SpringMVC了解吗?大多数面试者多会说出SpringMVC的执行流程图,其实我觉得这也没有错,毕竟SpringMVC就是按照这一套流程执行的,下面就是该执行流程图:

    今天我们就从源码的角度来看它到底是怎么执行的?下面这段代码它是DispatchServlet类中的doDispatch()方法,也就是我们上图的前端控制器

     1 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
     2         HttpServletRequest processedRequest = request;
     3         HandlerExecutionChain mappedHandler = null;
     4         boolean multipartRequestParsed = false;
     5         WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
     6 
     7         try {
     8             try {
     9                 ModelAndView mv = null;
    10                 Object dispatchException = null;
    11 
    12                 try {
    13                     processedRequest = this.checkMultipart(request);
    14                     multipartRequestParsed = processedRequest != request;
    15                     mappedHandler = this.getHandler(processedRequest);
    16                     if (mappedHandler == null) {
    17                         this.noHandlerFound(processedRequest, response);
    18                         return;
    19                     }
    20 
    21                     HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
    22                     String method = request.getMethod();
    23                     boolean isGet = "GET".equals(method);
    24                     if (isGet || "HEAD".equals(method)) {
    25                         long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
    26                         if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {
    27                             return;
    28                         }
    29                     }
    30 
    31                     if (!mappedHandler.applyPreHandle(processedRequest, response)) {
    32                         return;
    33                     }
    34 
    35                     mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    36                     if (asyncManager.isConcurrentHandlingStarted()) {
    37                         return;
    38                     }
    39 
    40                     this.applyDefaultViewName(processedRequest, mv);
    41                     mappedHandler.applyPostHandle(processedRequest, response, mv);
    42                 } catch (Exception var20) {
    43                     dispatchException = var20;
    44                 } catch (Throwable var21) {
    45                     dispatchException = new NestedServletException("Handler dispatch failed", var21);
    46                 }
    47 
    48                 this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);
    49             } catch (Exception var22) {
    50                 this.triggerAfterCompletion(processedRequest, response, mappedHandler, var22);
    51             } catch (Throwable var23) {
    52                 this.triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", var23));
    53             }
    54 
    55         } finally {
    56             if (asyncManager.isConcurrentHandlingStarted()) {
    57                 if (mappedHandler != null) {
    58                     mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
    59                 }
    60             } else if (multipartRequestParsed) {
    61                 this.cleanupMultipart(processedRequest);
    62             }
    63 
    64         }
    65     }

    下图就是该方法重要的第一步,获取执行链

    执行链中包含两个重要的属性,一个是handler(上图所说的handler),另一个是HandlerInterceptor(处理器拦截器的集合),下面再说这两个属性的作用

    进入getHandler(...)方法

    进入getHandler(...)这个方法

    未完。。。。。。

  • 相关阅读:
    js函数调用模式
    js闭包和回调
    js原型
    oracle sql优化笔记
    shell脚本学习
    程序与资源管理
    vi/vim学习
    压缩和解压缩
    用户及用户组
    万用字符和特殊字符
  • 原文地址:https://www.cnblogs.com/du001011/p/11791654.html
Copyright © 2011-2022 走看看