SpringMVC學(xué)習(xí)筆記(一)——原理以及源碼分析

1.SpringMVC框架

1.1定義

springmvc是spring框架的一個(gè)模塊勤众,springmvc和spring無需通過中間整合層進(jìn)行整合舆绎。
springmvc是一個(gè)基于mvc的web框架。

1.2 工作原理

springmvc原理圖02.png
  1. 瀏覽器發(fā)出request们颜,DispatcherServlet接收request并向HandlerMapping請求獲取andler
  2. HandlerMapping返回執(zhí)行后的Handler
  3. DispatcherServlet調(diào)用HandlerAdapter處理Handler,執(zhí)行完畢后返回ModelAndView
  4. DispatcherServlet接收到后請求ViewResolver對ModelAndView進(jìn)行解析吕朵,解析完畢后返回視圖
  5. DispatcherServlet對視圖進(jìn)行渲染呈現(xiàn)在客戶端并向?yàn)g覽器返回response

1.3 組件說明

(1) DispatcherServlet(核心組件)

SpringMVC的核心,類比cpu,在接受Http請求后負(fù)責(zé)各個(gè)組件的協(xié)調(diào)窥突,主要工作有以下三點(diǎn):

  • 截獲符合特定格式的URL請求努溃。
  • 初始化DispatcherServlet上下文對應(yīng)WebApplicationContext,并將其與業(yè)務(wù)層阻问、
    持久化層的WebApplicationContext建立關(guān)聯(lián)梧税。
  • 初始化Spring MVC的各個(gè)組成組件,并裝配到DispatcherServlet中称近。

(2)HandlerMapping:

能夠完成客戶請求到Controller映射第队。

(3)Controller:

需要為并發(fā)用戶處理上述請求,因此實(shí)現(xiàn)Controller接口時(shí)刨秆,必須保證線程安全并且可重用凳谦。
Controller將處理用戶請求,這和Struts Action扮演的角色是一致的衡未。一旦Controller處理完用戶請求尸执,則返回ModelAndView對象給DispatcherServlet前端控制器,

(4)ViewResolver:

Spring提供的視圖解析器(ViewResolver)在Web應(yīng)用中查找View對象缓醋,從而將相應(yīng)結(jié)果渲染給客戶如失。

(5)Handle(需要程序員開發(fā))

編寫Handler時(shí)按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler

ModelAndView中包含了模型(Model)和視圖(View)送粱。
從宏觀角度考慮褪贵,DispatcherServlet是整個(gè)Web應(yīng)用的控制器;從微觀考慮葫督,Controller是單個(gè)Http請求處理過程中的控制器竭鞍,而ModelAndView是Http請求過程中返回的模型(Model)和視圖(View)板惑。

2.源碼分析

2.1工作機(jī)制

在容器初始化時(shí)會建立所有url和controller的對應(yīng)關(guān)系,保存到Map<url,controller>中.tomcat啟動時(shí)會通知spring初始化容器(加載bean的定義信息和初始化所有單例bean),然后springmvc會遍歷容器中的bean,獲取每一個(gè)controller中的所有方法訪問的url,然后將url和controller保存到一個(gè)Map中;

這樣就可以根據(jù)request快速定位到controller,因?yàn)樽罱K處理request的是controller中的方法,Map中只保留了url和controller中的對應(yīng)關(guān)系,所以要根據(jù)request的url進(jìn)一步確認(rèn)controller中的method,這一步工作的原理就是拼接controller的url(controller上@RequestMapping的值)和方法的url(method上@RequestMapping的值),與request的url進(jìn)行匹配,找到匹配的那個(gè)方法;

確定處理請求的method后,接下來的任務(wù)就是參數(shù)綁定,把request中參數(shù)綁定到方法的形式參數(shù)上,這一步是整個(gè)請求處理過程中最復(fù)雜的一個(gè)步驟偎快。springmvc提供了兩種request參數(shù)與方法形參的綁定方法:

① 通過注解進(jìn)行綁定,@RequestParam

② 通過參數(shù)名稱進(jìn)行綁定.
  使用注解進(jìn)行綁定,我們只要在方法參數(shù)前面聲明@RequestParam("a"),就可以將request中參數(shù)a的值綁定到方法的該參數(shù)上.使用參數(shù)名稱進(jìn)行綁定的前提是必須要獲取方法中參數(shù)的名稱,Java反射只提供了獲取方法的參數(shù)的類型,并沒有提供獲取參數(shù)名稱的方法.springmvc解決這個(gè)問題的方法是用asm框架讀取字節(jié)碼文件,來獲取方法的參數(shù)名稱.asm框架是一個(gè)字節(jié)碼操作框架,關(guān)于asm更多介紹可以參考它的官網(wǎng).個(gè)人建議,使用注解來完成參數(shù)綁定,這樣就可以省去asm框架的讀取字節(jié)碼的操作.

2.2 閱讀源碼

水平不夠晒夹,以后再補(bǔ)充

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丐怯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子读跷,更是在濱河造成了極大的恐慌禾唁,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐枉,死亡現(xiàn)場離奇詭異掘托,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闪盔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門泪掀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人族淮,你說我怎么就攤上這事√蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵名惩,是天一觀的道長娩鹉。 經(jīng)常有香客問我攻谁,道長戚宦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任受楼,我火速辦了婚禮艳汽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘河狐。我一直安慰自己瑟捣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布丈钙。 她就那樣靜靜地躺著,像睡著了一般雏赦。 火紅的嫁衣襯著肌膚如雪芙扎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天俏橘,我揣著相機(jī)與錄音圈浇,去河邊找鬼。 笑死磷蜀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的褐隆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衫贬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梆造?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤澳窑,失蹤者是張志新(化名)和其女友劉穎供常,沒想到半個(gè)月后鸡捐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡源祈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年香缺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片图张。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诈悍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侥钳,到底是詐尸還是另有隱情,我是刑警寧澤苦酱,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布给猾,位于F島的核電站,受9級特大地震影響耙册,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一蔓同、第九天 我趴在偏房一處隱蔽的房頂上張望蹲诀。 院中可真熱鬧,春花似錦脯爪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至塔次,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間励负,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工巾表, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攒发。 一個(gè)月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓晋南,卻偏偏與公主長得像,于是被迫代替她去往敵國和親负间。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容