詳細(xì)執(zhí)行流程
流程圖
執(zhí)行流程
- 首先客戶端發(fā)起用戶請(qǐng)求叼旋,以http形式進(jìn)入到servlet容器中伴挚,servlet容器解析http數(shù)據(jù)成為一個(gè)endpoint對(duì)象靶衍,endpoint對(duì)象包含了請(qǐng)求url、http header以及解析完或者讀取完的body數(shù)據(jù)流茎芋。
- 然后進(jìn)入用戶自定義的filter颅眶,在filter中用戶可以對(duì)request進(jìn)行處理,然后經(jīng)過多個(gè)filter處理完后田弥,進(jìn)入到dispatcherservlet涛酗,也就是springmvc的入口。
- 然后會(huì)先進(jìn)入到一些常用的解析器中偷厦,比如用來解析上傳文件的MultipartResolver商叹,如果請(qǐng)求是Multipart,也就是說header包含Multipart只泼,springmvc就會(huì)解析上傳的請(qǐng)求里面的上傳文件剖笙,解析成字節(jié)流,以及把一些字符串k请唱、v讀出來弥咪,封裝到對(duì)象中以供后續(xù)的comtroller進(jìn)行接收,從解析器出來后十绑,就是根據(jù)請(qǐng)求url尋找handler(controller)的過程聚至。
- 由于我們?cè)赾ontroller方法中使用requestMapping注解定義了url映射,在啟動(dòng)過程中springmvc就會(huì)將controller及對(duì)應(yīng)的方法注冊(cè)到HandlerMapping中本橙,如果無法在handlerMapping中找到請(qǐng)求對(duì)應(yīng)的controller扳躬,就會(huì)報(bào)404錯(cuò)誤。
- 找到controller后進(jìn)入到HandlerInterceptor,即攔截器坦报,在攔截器中可以進(jìn)行打印日志库说,身份鑒權(quán)等操作。
- 經(jīng)過攔截器后片择,springmvc會(huì)對(duì)數(shù)據(jù)進(jìn)行綁定(與方法參數(shù)進(jìn)行綁定)潜的,及數(shù)據(jù)驗(yàn)證,反射調(diào)用我們的controller方法字管,執(zhí)行方法體中的業(yè)務(wù)邏輯啰挪,執(zhí)行完成后創(chuàng)建ModelAndView。model就是數(shù)據(jù)嘲叔,此時(shí)的view只是個(gè)viewName(String)亡呵。
- 如果我們定義了異常處理器,在攔截器處理數(shù)據(jù)綁定硫戈、數(shù)據(jù)驗(yàn)證锰什、業(yè)務(wù)處理這些所有環(huán)節(jié),只要出現(xiàn)了異常丁逝,都會(huì)被異常處理器攔截汁胆,可以在異常處理中返回相應(yīng)的錯(cuò)誤頁面。
- 如果正常執(zhí)行霜幼,會(huì)通過ViewResolver進(jìn)行view的資源定位,找到view之后就會(huì)進(jìn)入渲染頁面的過程嫩码,實(shí)際是將數(shù)據(jù)進(jìn)行模版的變量替換的過程,數(shù)據(jù)來源于request,modelMap,session中罪既。
- 渲染之后就經(jīng)過dispatcherservlet返回铸题,再經(jīng)過filter后續(xù)的處理,最終通過servlet容器形式http響應(yīng)返回給客戶端琢感。
核心執(zhí)行流程
流程圖
執(zhí)行流程
- 客戶端請(qǐng)求被DispatcherServlet(前端控制器)接收
- DispatcherServlet請(qǐng)求HandlerMapping查詢Handler
- HandlerMapping根據(jù)請(qǐng)求URL查找Handler丢间,將Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回給DispatcherServlet
- DispatcherServlet請(qǐng)求HandlerAdapter執(zhí)行Handler
- HandlerAdapter調(diào)用Handler的方法做業(yè)務(wù)邏輯處理
- HandlerAdapter處理完Handler會(huì)生成一個(gè)ModelAndView對(duì)象
- 將ModelAndView對(duì)象返回給DispatcherServlet
- DispatcherServlet將獲取的ModelAndView對(duì)象傳給ViewResolver視圖解析器,請(qǐng)求進(jìn)行視圖解析
- ViewResolver將邏輯視圖解析成物理視圖View猩谊,返回給DispatcherServlet
- DispatcherServlet根據(jù)View進(jìn)行視圖渲染(將模型數(shù)據(jù)填充到視圖中)
- DispatcherServlet將渲染后的視圖響應(yīng)給客戶端