今天就由本大佬(請(qǐng)?jiān)徫沂褂昧寺晕⒖鋸埖男揶o手法)親自帶隊(duì),來(lái)為大家導(dǎo)游,帶領(lǐng)大家探秘神奇的SpringMVC世界,重走一次HTTP請(qǐng)求處理之路,本次行程共計(jì)7站,約用時(shí)10分鐘。
來(lái)來(lái)來(lái),上車的請(qǐng)把票買一下(點(diǎn)個(gè)贊、交個(gè)朋友嘛),說(shuō)你呢!對(duì)!說(shuō)的就是你,長(zhǎng)這么帥,不點(diǎn)贊想啥呢?(別打我……保護(hù)猿類,人人有責(zé))
OK,現(xiàn)在我們每個(gè)人都有一張門票(想象成每個(gè)人都是一個(gè)HTTP請(qǐng)求),每張票上都有一串神秘代碼(不是你們想的那種神秘代碼,就想象成請(qǐng)求鏈接url),車票都保存好,一會(huì)進(jìn)大門可要檢查的。
坐穩(wěn)了,老司機(jī)這就帶你起飛……
景區(qū)大門
OK,現(xiàn)在我們首先來(lái)到DispatcherServlet,它是作為SpringMVC的大門而存在,只有先穿過(guò)它,才能到達(dá)真正的入口。
我先來(lái)給大家科普(八卦)一下DispatcherServlet的來(lái)歷:
這DispatcherServlet雖然整了個(gè)高大上洋文名,但我們千萬(wàn)不要被它唬住,它本質(zhì)上還是我們熟悉的那個(gè)翠花(普通Servlet類),在這給我裝啥呢?
來(lái)來(lái)來(lái),咱們繼續(xù)往前走,前面即將到達(dá)doDispatch,大家都跟上!
有人問(wèn)doDispatch是個(gè)啥地方呀?
它呀,相當(dāng)于景區(qū)的檢票口,通過(guò)之后各位就可以自由活動(dòng)了,最后出來(lái)時(shí)我們?cè)俚竭@里集合。
來(lái)來(lái)來(lái),這是本次的線路圖,大家都來(lái)看一下!(ps:看一次5元,養(yǎng)家糊口不容易啊):
檢票口
大家排好隊(duì),把門票都拿出來(lái),準(zhǔn)備檢票啦~大包小包,過(guò)機(jī)安檢(有沒(méi)有一種來(lái)到車站的感覺(jué))。
什么?把票弄丟了?別鬧,腰不好。
到底檢查啥呢?
這個(gè)問(wèn)題問(wèn)的好,一看就是個(gè)文化人。
這一步主要是檢查你有沒(méi)有攜帶物品(是不是一個(gè)上傳文件請(qǐng)求),如果你攜帶了物品,那么工作人員就會(huì)把你的物品取出來(lái)包裝一下、變成MultipartFile再還給你,再給你身上貼上一個(gè)此人攜帶貴重物品的標(biāo)志,也就是multipartRequestParsed標(biāo)志位(這是深怕別人不知道你有錢啊),把你和沒(méi)帶物品的人區(qū)分開。
確定路線
OK,檢查完畢以后,接下來(lái)就是各自確定游玩路線。
各位攜帶貴重物品的大佬們,等會(huì)交個(gè)朋友唄!(你們還缺一位可愛真誠(chéng)的小老弟嗎?)
怎么確定路線?
這個(gè)問(wèn)題提的太好了!怎么又是你?這位機(jī)智的朋友,我已經(jīng)記住你了。
我們每個(gè)人不是都有一張門票嘛,門票上都有一串神秘代碼(請(qǐng)求鏈接url),這里我們就是通過(guò)這個(gè)神秘代碼來(lái)找到各自對(duì)應(yīng)的路線(根據(jù)請(qǐng)求url找到對(duì)應(yīng)的Controller、以及方法)。
前期準(zhǔn)備工作
在每個(gè)人確定各自的路線后,大家有5分鐘時(shí)間準(zhǔn)備一下,現(xiàn)在有事還能回去,過(guò)了這村可就回不去啦。
在這期間可以做些什么事呢?
這個(gè)問(wèn)題同樣的非常好,首先我們來(lái)看一下:
HandlerInterceptor?是不是有點(diǎn)熟悉?對(duì),你沒(méi)有看錯(cuò)!就是攔截器。在這里SpringMVC會(huì)首先調(diào)用我們攔截器里的preHandle方法。
Tip:在preHandle方法里我們可以提前進(jìn)行一些登錄校驗(yàn)、權(quán)限校驗(yàn)、日志記錄等的工作,可以將一些非法的請(qǐng)求拒之門外。
正式暢玩
都準(zhǔn)備好了吧?那么大家就按照的路線去玩耍吧(執(zhí)行Controller業(yè)務(wù)邏輯),最后還會(huì)有拼圖大禮包再向你們招手呢(返回模型視圖ModelAndView)
本寶寶就在這瞇一會(huì)等你們!(反正你們最后會(huì)發(fā)現(xiàn)還會(huì)回到這兒的)
一路都有啥好玩的?
這我可得給你好好說(shuō)道說(shuō)道。來(lái),坐下,小筆記記好:
首先參數(shù)解析器會(huì)對(duì)它進(jìn)行一個(gè)參數(shù)解析、校驗(yàn)、參數(shù)綁定的操作過(guò)程,然后才會(huì)到達(dá)我們的Controller方法進(jìn)行具體的業(yè)務(wù)處理,最終都會(huì)返回一個(gè)ModelAndView。
結(jié)束前的準(zhǔn)備工作
大家都回來(lái)了沒(méi)有?沒(méi)回來(lái)的吱個(gè)聲!(吱聲我也聽不到)
準(zhǔn)備返回之前,我們還有一點(diǎn)時(shí)間可以搞點(diǎn)事情。
可以搞哪些事情?
HandlerInterceptor!恭喜這位朋友,都學(xué)會(huì)搶答了!
對(duì),又是HandlerInterceptor攔截器,在這里會(huì)調(diào)用后置處理方法postHandle。
Tip:在postHandle方法里我們有機(jī)會(huì)對(duì)返回的模型數(shù)據(jù)和試圖數(shù)據(jù)進(jìn)行最后的修改。
返程
歡樂(lè)的時(shí)光總是這么短暫,我們愉快的HTTP請(qǐng)求之旅到這里就接近尾聲了。
返程途中可以干什么?
返程途中大家可以拿出拼圖大禮包(ModelAndView),拼出一幅美麗的圖畫(View渲染)。
在這一步,DispatcherServlet會(huì)將模型數(shù)據(jù)(Model)渲染到View模版上生成一個(gè)新的視圖,也就是我們看到的頁(yè)面了,當(dāng)然了也有可能只有數(shù)據(jù)沒(méi)有視圖,就像我們寫接口一樣。