1.SpringMVC框架
1.1定義
springmvc是spring框架的一個(gè)模塊勤众,springmvc和spring無需通過中間整合層進(jìn)行整合舆绎。
springmvc是一個(gè)基于mvc的web框架。
1.2 工作原理
- 瀏覽器發(fā)出request们颜,DispatcherServlet接收request并向HandlerMapping請求獲取andler
- HandlerMapping返回執(zhí)行后的Handler
- DispatcherServlet調(diào)用HandlerAdapter處理Handler,執(zhí)行完畢后返回ModelAndView
- DispatcherServlet接收到后請求ViewResolver對ModelAndView進(jìn)行解析吕朵,解析完畢后返回視圖
- 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ǔ)充