spring 源码解析–mvc 处理流程

客户端发出HTTP请求,框架找到并执行对应的方法,最后将执行的结果进行返回

简单的版本预设条件: 1.不用实现过滤器, 2.只允许Ajax请求

架构

关系

component request
frame UrlMapping{
   storage SimpleUrlHandlerMapping  
} 

frame ControllerAdapter{
    storage HandleAdapter
}
frame ResultHandler{
  storage ModelView
}
request ->UrlMapping

UrlMapping:根据request的请求找到执行器chain ControllerAdapter: 执行器的适配器 ResultHandler:处理执行器的结果 类图

 class HandlerExecutionChain{
   Object handler: Controller 也就是我们自己的写的controller
   List<HandlerInterceptor> interceptorList: 拦截器列表
   int interceptorIndex: 拦截器执行的索引
   applyPreHandle(request,response):boolean 执行前置拦截器
   applyPostHandler(request, response): boolean 执行后置拦截器 
 }
 class HandlerAdapter{
    supports():boolean 给定一个handler 判断其是否可以处理
    handler(request,response,handler):ModelView 执行方法
    getLastModified(request, handler): long
 }
 
 class HandlerInterceptor{
   preHandler(request,response,handler):boolean
   postHandler(request,response,handler):boolean
   afterCompletion(request,response,handler):boolean after rendering the view
 }

HandlerExecutionChain 执行器 HandlerAdapte handler的适配器 对controller进行管控 HandlerInterceptor 拦截器父类

时序图

    actor User as U
    boundary WebContainer as C
    control DispatcherServlet as D
    control HandlerExecutionChain as E
    control HandlerAdapter as A
    control HandlerIntercepter as I
    
    U->C: send request
    C->D: doService
    D-> E: getHandler(request)
    E-->D: return chain
    D->A: getHandlerAdapter(chain)
    A-->D: return HandlerAdapter
    D-> D: HandlerExecutionChain.applyPreHandler \n 开始执行前置拦截器
    D-> D: HandlerAdapter.handler mv \n 开始执行Controller中的方法
    D-> D: applyDefaultViewName(request, mv) \n 返回默认的视图
    D-> D: applyPostHandler(result, response, mv) \n 执行后置拦截器 
    D->D: processDispatchResult \n (request, response, mappedHandler, mv, dispatchException)\n 处理返回的结果
    D->D: applyAfterConcurrentHandlingStarted(request, response) \n 执行拦截器的completion方法