關(guān)鍵字:Handler處理器,DispatchServlet它匕,POJO吩跋,Json寞射,@RequestBody,@ResponseBody钞澳,攔截/監(jiān)聽/過濾
SpringMVC和spring怠惶,springboot他們是什么關(guān)系呢?
光看名字感覺像轧粟,但實際上并不是這樣的。
使用到它的框架是ssm脓魏,就是spring+springMVC+mybatis兰吟;
更早的是ssh,就是spring+struts+hibernate茂翔,mybatis和hibernate都是連接數(shù)據(jù)庫的混蔼,springMVC就是用來代替struts的,它是一個前端框架珊燎。
經(jīng)典三層架構(gòu)
先說一下經(jīng)典的三層架構(gòu)
表現(xiàn)層:web層惭嚣,和用戶交互。
業(yè)務(wù)層:service層悔政,處理業(yè)務(wù)晚吞。
持久層:dao層,對數(shù)據(jù)庫操作谋国。
MVC在表現(xiàn)層又分了三層槽地,全名是 Model View Controller;
模型Mode:業(yè)務(wù)模型(業(yè)務(wù)邏輯)和數(shù)據(jù)模型(傳來傳去的那些參數(shù),比如一個user)
視圖View:jsp捌蚊,html集畅,現(xiàn)在流行的是vue,就是頁面缅糟。
控制器Controller:controller層挺智,少量邏輯,一般寫點權(quán)限控制窗宦。
竹簽和筷子(原生servlet和DispatchServlet)
書接上回Spring:從就地燒烤到上桌吃飯 - 簡書 (jianshu.com)逃贝,原始的烤串模式每個菜都需要一根竹簽,既然我們現(xiàn)在已經(jīng)上桌了迫摔,我們就不需要浪費竹子了沐扳,只需要用竹子做一雙筷子,就可以重復使用句占。
原生的servlet模式沪摄,每有一個業(yè)務(wù)就需要一個servlet;
SpringMVC全局只有一個servlet處理所有需求纱烘,這就是DispatchServlet前端控制器杨拐。
DispatchServlet連接controller層(使用springMVC框架后已經(jīng)很久沒寫過servlet了,jsp也不用了)擂啥,多個業(yè)務(wù)只需要寫多個controller哄陶。
一桌菜(Handler處理器)
現(xiàn)在有筷子了,就該開吃了哺壶?
用springMVC怎么能吃這么簡單的席屋吨,最起碼要自助餐。
1,首先用戶拿著筷子(DispatchServlet前端控制器)山宾;
2,看了一眼自助餐廳的桌子上的牌子(HandlerMapping處理器映射器)知道了龍蝦在哪至扰,
3,然后拿著小餐盤(HandlerAdapter處理器適配器),如果要果汁的話需要用杯子(不同的適配器處理不同的Handler)资锰,
4,直奔海鮮區(qū)弄了幾只龍蝦(Handler)回來(至于龍蝦是怎么做的那是spring的事)敢课,
5,回來之后用筷子夾起來看看(ViewResolver視圖解析器)再吃(響應(yīng)用戶)。
這就是springMVC的請求處理流程(重點記憶)
這個場景下DispatchServlet比喻成筷子有點牽強绷杜,或者可以把他想象成幫你去加菜的男朋友直秆,
這樣就合理多了,所有事都是他在做鞭盟,最后給個反饋圾结。
HandlerMapping處理器映射器:springMVC初始化時將<url,Handler方法>保存到HandlerMapping中,只需要有url地址就能訪問到方法懊缺。
HandlerAdapter處理器適配器:處理器適配器接口中有個方法會判斷該適配器是否適合當前Handler疫稿,用來找到一個適合當前Handler的適配器子類培他,目的就是把不同的Handler包裝成統(tǒng)一口徑。
Handler就是Controller層的方法遗座,執(zhí)行完Handler方法后返回ModelAndView舀凛;
ModelAndView是springMVC的一個底層對象,估計大家都只見過封裝后的返回類途蒋。
菜名(POJO包裝對象)
隨著菜品越來越復雜猛遍,配料越來越多,你不會再說我要吃一塊豬肉加點梅菜号坡,我要吃帶骨羊肉加點孜然等等懊烤,這樣說效率太低,容易搶不到菜宽堆;而是說我要吃梅菜扣肉腌紧,我要吃烤羊排。
項目也是一樣越來越大畜隶,越來越復雜壁肋,參數(shù)也越來越多,原始的傳參方式已經(jīng)不好用了籽慢;需要使用POJO包裝對象浸遗,
例如你要傳一個id,一個name箱亿,一個age跛锌;現(xiàn)在只需要傳一個user,里面包含user.id,user.name,user.age届惋;寫代碼的時候很省事髓帽,但是實際上效果是一樣的。
具體實現(xiàn)估計和json還有反射有關(guān)盼樟,Mybatis也有POJO
@RequstBody:后臺接收POJO類型需要加上注解@RequstBody
@ResponseBody:向前端直接返回POJO類型需要加上注解@ResponseBody
順便說下json氢卡,json是一種簡化的document,沒有了<>標簽晨缴,數(shù)據(jù)量更小峡捡;
你的媽媽(攔截/監(jiān)聽/過濾)
吃飯的時候總有一個人告訴你什么能吃什么不能吃击碗,這個應(yīng)該這樣吃那個應(yīng)該那樣吃。
過濾器(filter):濾掉一些不該吃的東西们拙;
對Requst請求起到過濾作用稍途,作用在servlet之前。
監(jiān)聽器(listener):從你動筷子的時候就盯著你了砚婆;
應(yīng)用啟動的時候啟動械拍,只初始化一次突勇,應(yīng)用銷毀時銷毀;一般做一些初始化工作坷虑,springboot的run方法中有很多地方用到了監(jiān)聽(下次說springboot時再說)甲馋;監(jiān)聽一些特定事件,做在線人數(shù)統(tǒng)計迄损。
攔截器(interceptor):你媽媽會在你準備夾菜時定躏,夾到菜時和吃進菜前嘮叨你幾句。
只會攔截控制器方法(Handler)芹敌,攔截器有三次執(zhí)行機會痊远,
1.在Handler業(yè)務(wù)邏輯執(zhí)行前攔截,
2.在Handler業(yè)務(wù)邏輯執(zhí)行結(jié)束后攔截氏捞,
3.在跳轉(zhuǎn)頁面前攔截碧聪。
一個小發(fā)現(xiàn):Rest風格中put和delete都是本質(zhì)都是post方法