《看透SpringMVC》第十章 SpringMVC之用

10 SpringMVC之用

10.2 FrameworkServlet

微信截圖_20171125153751

跳來跳去最終跳到ProcessRequest()web

工做:微信

  • 【保存】原來的LocaleContextHolder 和 RequestContextHolder
  • 異步相關
  • 設置request到 LocaleContextHolder 和 RequestContextHolder
  • doService()
  • 【恢復】LocaleContextHolder 和 RequestContextHolder
  • 【發佈消息】ServletRequestHandledEvent (能夠添加監聽器,用做log記錄)

不懂爲啥保存/恢復LocaleContextHolder 和 RequestContextHolderapp

LocaleContextHolder 和 RequestContextHolder都是使用ThreadLocal來保存信息。webapp

其中有兩個ThreadLocal,一個是NamedThreadLocal一個是NamedInheritableThreadLocal(能夠被子線程繼承的)異步

一個線程的數據都保存在namedThreadLocal ,這個線程的子線程的數據都保存在NamedInheritableThreadLocalpost

爲何不用一個NamedInheritableThreadLocal得了??url

10.3 DispatcherServlet

doService()

  • 【快照】當include請求時對request作Attribute快照
  • 設置屬性到request
    • webapplicationcontext
    • localeResolver
    • themeResolver
    • themeSource
    • flashmap相關屬性
  • doDispatch()
  • 【還原快照】

RedirectAttribute的使用spa

  • RedirectAttribute.addAttribute() 參數鏈接在url末尾
  • RedirectAttribute.addFlashAttribute() 設置到FlashMap

doDispatch()

  • checkMultipart(request) 檢查是否是上傳請求,若是上傳請求,使用MultipartResolver來解析request。線程

  • getHandler(request) 根據request找handler繼承

  • getHandlerAdapter(handler) 根據handler找hanlderAdapter

  • 處理Last-Modified

  • 處理請求

    • applyPreHandle() (interceptor的perhandler())
    • handle()
    • 設置默認view
    • applyPostHandle() (posthandler())
  • processDispatchResult()

    • 處理異常 || 用到了HandlerExceptionResolver 設置error相關的view 和 Attribute 放入request。
    • 渲染頁面
      • localeResolver 解析locale,設置到response中。
      • MV中的view是string 須要使用viewResolver
      • view.render() 渲染
    • 觸發interceptor的afterCompletion
相關文章
相關標籤/搜索