10 SpringMVC之用
10.2 FrameworkServlet
跳來跳去最終跳到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