SpringMVC的请求过程 - 图1



    浏览器发起一次请求过来先到FrameworkServlet#service方法 ,先解析是get请求还是post请求,如果是get请求会调用到FrameworkServlet#doGet方法,

    然后调用processRequest 处理请求,先给当前的request请求设置到RequestContext,然后调用DispatcherServlet#doService方法,这是SpringMVC处理请求的入口,之前都是Servlet处理请求.

    然后DispatcherServlet#doService调用DispatcherServlet#doDispatch

    doDispatch方法内部调用了

    1. DispatcherServlet#doService调用DispatcherServlet#getHandler(参数是request)调用到HandlerMapping#getHandler(AbstractHandlerMapping的getHandler)调用AbstractHandlerMapping#getHandlerExecutionChain,getHandlerExecutionChain方法里面给拦截器加入到拦截器链 ,然后返回HandlerExecutionChain.因为根据这个url可能会有多个方法被执行,比如说拦截器.
    当然如果返回的null说明,这个request里面的url没有,就提示404..

    2.DispatcherServlet#doService调用DispatcherServlet#getHandlerAdapter ,传入参数是HandlerMethod对象,通过HandlerMethod对象确定当前请求的处理程序适配器,返回的是HandlerAdapter(RequestMappingHandlerAdapter类型的)

    3. DispatcherServlet#doService调用到HandlerExecutionChain#applyPreHandle执行拦截器的preHandle(前置处理)方法(构造方法,具体逻辑程序员自己实现).如果返回false说明被拦截器了.就直接return了.
    4. DispatcherServlet#doService内部
    然后HandlerAdapter(RequestMappingHandlerAdapter)调用handle方法(传入参数是request,response,HandlerMethod)调用invokeHandlerMethod,进行传入参数处理, 然后就调用到了我们程序员编写的Controller里面的指定方法了.获取到方法的返回结果(Object类型)

    5.DispatcherServlet#doService内部
    HandlerExecutionChain#applyPostHandle调用拦截器的postHandle方法(后置拦截),

    6. DispatcherServlet#doService内部调用DispatcherServlet#processDispatchResult处理程序员编写的Controller层的方法的返回结果,主要作用就是给返回结果处理完了就可以输出给前端了,
    processDispatchResult调用DispatcherServlet#render把具体的view进行渲染,渲染成html能接受的格式,如果是jsp就渲染成jsp,如果是json就渲染成json.,总之view可以是任何东西

    最后就是就是Tomcat代码了.