1- Spring MVC簡(jiǎn)介
Spring MVC是一種基于Java的實(shí)現(xiàn)了Web MV設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類(lèi)型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將web層進(jìn)行職責(zé)解耦,基于請(qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開(kāi)發(fā),Spring MVC也是要簡(jiǎn)化我們?nèi)粘eb開(kāi)發(fā)的。支持本地化(Locale)解析、主題(Theme)解析及文件上傳等;提供了非常靈活的數(shù)據(jù)驗(yàn)證、格式化和數(shù)據(jù)綁定機(jī)制;提供了強(qiáng)大的約定大于配置(慣例優(yōu)先原則)的契約式編程支持
2- Spring MVC請(qǐng)求處理流程
如果web服務(wù)器是Tomcat,則Tomcat將遠(yuǎn)程客戶(hù)端TCP連接(socket),轉(zhuǎn)換為Request對(duì)象,傳遞給前端控制器DispatcherServlet
流程:
首先用戶(hù)發(fā)送請(qǐng)求————>前端控制器,前端控制器根據(jù)請(qǐng)求信息(如URL)來(lái)決定選擇哪一個(gè)頁(yè)面控制器進(jìn)行處理并把請(qǐng)求委托給它,即以前的控制器的控制邏輯部分;圖中的1、2步驟;
頁(yè)面控制器接收到請(qǐng)求后,進(jìn)行功能處理,首先需要收集和綁定請(qǐng)求參數(shù)到一個(gè)對(duì)象,這個(gè)對(duì)象在Spring Web MVC中叫命令對(duì)象,并進(jìn)行驗(yàn)證,然后將命令對(duì)象委托給業(yè)務(wù)對(duì)象進(jìn)行處理;處理完畢后返回一個(gè)ModelAndView(模型數(shù)據(jù)和邏輯視圖名);圖中的3、4、5步驟;
前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進(jìn)行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染;圖中的步驟6、7;
前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶(hù),圖中的步驟8;至此整個(gè)結(jié)束。
3- Spring MVC核心架構(gòu)
核心架構(gòu)的具體流程步驟如下:
- 首先用戶(hù)發(fā)送請(qǐng)求 網(wǎng)址/hello——>web容器,web容器根據(jù)“/hello”路徑映射到DispatcherServlet(url-pattern為/)進(jìn)行處理;
DispatcherServlet,前端控制器收到請(qǐng)求后自己不進(jìn)行處理,而是委托給其他的解析器進(jìn)行處理,作為統(tǒng)一訪(fǎng)問(wèn)點(diǎn),進(jìn)行全局的流程控制;
DispatcherServlet——>HandlerMapping, HandlerMapping將會(huì)把請(qǐng)求映射為HandlerExecutionChain對(duì)象(包含一個(gè)Handler處理器(頁(yè)面控制器--路徑和@RequestMapping注解一致的Controller類(lèi))對(duì)象、多個(gè)HandlerInterceptor攔截器)對(duì)象,通過(guò)這種策略模式,很容易添加新的映射策略;
DispatcherServlet——>HandlerAdapter,HandlerAdapter將會(huì)把處理器包裝為適配器,從而支持多種類(lèi)型的處理器,即適配器設(shè)計(jì)模式的應(yīng)用,從而很容易支持很多類(lèi)型的處理器;
HandlerAdapter——>處理器功能處理方法的調(diào)用,HandlerAdapter將會(huì)根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法,完成功能處理;并返回一個(gè)ModelAndView對(duì)象(包含模型數(shù)據(jù)、邏輯視圖名);
ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析為具體的View,通過(guò)這種策略模式,很容易更換其他視圖技術(shù);
View——>渲染,View會(huì)根據(jù)傳進(jìn)來(lái)的Model模型數(shù)據(jù)進(jìn)行渲染(比如對(duì)JSP進(jìn)行渲染,填充model數(shù)據(jù)),此處的Model實(shí)際是一個(gè)Map數(shù)據(jù)結(jié)構(gòu),因此很容易支持其他視圖技術(shù);
返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶(hù),到此一個(gè)流程結(jié)束。
4- MVC 組成
MVC設(shè)計(jì)模式或者叫做范式:view負(fù)責(zé)應(yīng)用的展示;model封裝了應(yīng)用的業(yè)務(wù)數(shù)據(jù),以及部分業(yè)務(wù)邏輯;controller負(fù)責(zé)接收用戶(hù)輸入,改變模型,調(diào)整對(duì)應(yīng)的視圖顯示。
4.1- MVC 中的MV
- M指的是ORM框架的model,或者是數(shù)據(jù)庫(kù)的表記錄,指的是數(shù)據(jù)
- V指的是用來(lái)展示數(shù)據(jù)的視圖View,可以是JSP也可以是HTML模板
4.2- MVC中的C
因此MVC中完整的C(包含控制邏輯+功能處理)由(DispatcherServlet + Controller)組成。因此此處的控制器是Web MVC中部分,也可以稱(chēng)為頁(yè)面控制器、動(dòng)作、處理器。
- Controller控制器(實(shí)現(xiàn)Controller接口的類(lèi)),是MVC中的部分C,為什么是部分呢?因?yàn)榇颂幍目刂破髦饕?fù)責(zé)功能處理部分:
- 收集、驗(yàn)證請(qǐng)求參數(shù)并綁定到命令對(duì)象;
- 將命令對(duì)象交給業(yè)務(wù)對(duì)象,由業(yè)務(wù)對(duì)象處理并返回模型數(shù)據(jù);
- 返回ModelAndView(Model部分是業(yè)務(wù)對(duì)象返回的模型數(shù)據(jù),視圖部分為邏輯視圖名)。
- DispatcherServlet,主要負(fù)責(zé)整體的控制流程的調(diào)度部分:
- 負(fù)責(zé)將請(qǐng)求委托給控制器進(jìn)行處理;
- 根據(jù)控制器返回的邏輯視圖名選擇具體的視圖進(jìn)行渲染(并把模型數(shù)據(jù)傳入)。
5- Spring MVC 支持的注解
@Controller:用于標(biāo)識(shí)是處理器類(lèi);
@RequestMapping:請(qǐng)求到處理器功能方法的映射規(guī)則;
@RequestParam:請(qǐng)求參數(shù)到處理器功能處理方法的方法參數(shù)上的綁定;
@ModelAttribute:請(qǐng)求參數(shù)到命令對(duì)象的綁定;
@SessionAttributes:用于聲明session級(jí)別存儲(chǔ)的屬性,放置在處理器類(lèi)上,通常列出模型屬性(如@ModelAttribute)對(duì)應(yīng)的名稱(chēng),則這些屬性會(huì)透明的保存到session中;
@InitBinder:自定義數(shù)據(jù)綁定注冊(cè)支持,用于將請(qǐng)求參數(shù)轉(zhuǎn)換到命令對(duì)象屬性的對(duì)應(yīng)類(lèi)型;
RESTful架構(gòu)風(fēng)格支持
@CookieValue:cookie數(shù)據(jù)到處理器功能處理方法的方法參數(shù)上的綁定;
@RequestHeader:請(qǐng)求頭(header)數(shù)據(jù)到處理器功能處理方法的方法參數(shù)上的綁定;
@RequestBody:請(qǐng)求的body體的綁定(通過(guò)HttpMessageConverter進(jìn)行類(lèi)型轉(zhuǎn)換);
@ResponseBody:處理器功能處理方法的返回值作為響應(yīng)體(通過(guò)HttpMessageConverter進(jìn)行類(lèi)型轉(zhuǎn)換);
@ResponseStatus:定義處理器功能處理方法/異常處理器返回的狀態(tài)碼和原因;
@ExceptionHandler:注解式聲明異常處理器;
@PathVariable:請(qǐng)求URI中的模板變量部分到處理器功能處理方法的方法參數(shù)上的綁定,從而支持RESTful架構(gòu)風(fēng)格的URI;
參考教程
Spring MVC
http://www.lxweimin.com/p/5ced51e632a1
Spring Boot
http://www.lxweimin.com/p/48387d502673