1.客戶端發(fā)起請(qǐng)求
2.以HTTP形式進(jìn)入到Servlet容器中,Servlet容器解析HTTP數(shù)據(jù)成Endpoint對(duì)象,EndPoint對(duì)象里包含了請(qǐng)求的url,Http header以及解析完的body數(shù)據(jù)流,然后進(jìn)入用戶自定義的filter,用戶可以在filter中對(duì)request進(jìn)行處理,處理完成后進(jìn)入SpringMVC 的dispatcher Servlet
3.進(jìn)入常見(jiàn)的解析器,如MultiPartResolver 如果請(qǐng)求頭包含了multipart/XXX,spring將上傳文件解析為byte流以及把字符串key-value讀出來(lái)封裝到對(duì)象中 給后面的處理器(也就是controller)接收.
4.從解析器出來(lái)后,調(diào)用處理器適配器找到對(duì)應(yīng)的處理器(controller)(@RequstMapping將我們定義的方法與url建立映射注冊(cè)到Handler Mapping),如果找不到請(qǐng)求對(duì)應(yīng)的handler則拋出404錯(cuò)誤.否則正常執(zhí)行進(jìn)入到HandlerInterceptor(在攔截器這里,用戶可以打印日志,權(quán)限身份等操作),經(jīng)過(guò)攔截器后spring會(huì)對(duì)數(shù)據(jù)進(jìn)行綁定(和Request Mapping注解方法的參數(shù)進(jìn)行綁定)或數(shù)據(jù)驗(yàn)證.返回:反射調(diào)用controller方法,這時(shí)進(jìn)入controller方法體執(zhí)行具體的業(yè)務(wù)操作,邏輯執(zhí)行完成后,創(chuàng)建ModelAndView(數(shù)據(jù)和模板)對(duì)象,View只是一個(gè)viewName.如果定義了異常處理器,在數(shù)據(jù)綁定、數(shù)據(jù)驗(yàn)證和業(yè)務(wù)邏輯發(fā)生了異常時(shí),都會(huì)被異常處理器攔截(可以在里面對(duì)異常做自己的處理).
5.資源定位,找到后進(jìn)行頁(yè)面渲染.渲染的過(guò)程實(shí)際是將數(shù)據(jù)進(jìn)行模板變量替換的過(guò)程,數(shù)據(jù)來(lái)自request,ModelMap,Session.渲染完成后經(jīng)過(guò)dispatcher Servlet返回.
6.經(jīng)過(guò)filter后置處理,經(jīng)過(guò)servlet容器HTTP響應(yīng)給客戶端