MVC是一種構(gòu)架,那么這種構(gòu)架的工作原理是什么呢?想必很多人都不知道。其實(shí)它的工作原理有點(diǎn)復(fù)雜。一些專業(yè)術(shù)語的介紹也不太讓人清楚它到底是一個(gè)什么樣的工作原理。但從名字的三個(gè)字母的組成來看,就會(huì)變得簡單。M代表Model,主要是負(fù)責(zé)整個(gè)解決方案的業(yè)務(wù)邏輯實(shí)現(xiàn),底層的數(shù)據(jù)庫也由Model訪問和操作;V代表View,負(fù)責(zé)系統(tǒng)向用戶的展示,主要由HTML及JSP等完成;而C又主要是為了實(shí)現(xiàn)用戶與任務(wù)的通信;另一方面處理來自其它的結(jié)果,最后由ControllerA進(jìn)行處理。
1.當(dāng)用戶在瀏覽器中點(diǎn)擊一個(gè)鏈接或者提交一個(gè)表單時(shí),那么就會(huì)產(chǎn)生一個(gè)請求(request)。當(dāng)請求離開瀏覽器時(shí),它會(huì)攜帶用戶請求的信息。
2.請求的第一站到達(dá)的是Spring的DispatcherServlet,它是一個(gè)前端控制器,工作是將用戶的請求委托給其他的組件(這里是交給Spring MVC的控制器)去處理。
這里DispatcherServlet要決定將請求傳給哪一個(gè)控制器(Controller)去處理,那么這時(shí)就需要處理器映射(Handler Mapping)了。
處理器映射會(huì)看請求的URL信息,然后決定將請求交給哪一個(gè)控制器去處理。比如說有兩個(gè)控制器ControllerA和ControllerB,分別處理后綴名為.html和.jsp送來的請求,那么當(dāng)請求者的后綴名為.html時(shí),那么DispatcherServlet就將請求交給ControllerA進(jìn)行處理。
C代表Controller,負(fù)責(zé)用戶界面和業(yè)務(wù)邏輯層的通信控制,一方面解釋來自用戶界面的輸入,識別用戶動(dòng)作(如點(diǎn)擊按鈕等),調(diào)用相應(yīng)Model中的方法,另一方面處理來自Model的事件和返回的執(zhí)行結(jié)果,調(diào)用適當(dāng)?shù)腣iew顯示給用戶,Controller主要由Servlet完成。
M代表Model,負(fù)責(zé)整個(gè)解決方案的業(yè)務(wù)邏輯實(shí)現(xiàn),底層的數(shù)據(jù)庫也由Model訪問和操作;
V代表View,負(fù)責(zé)系統(tǒng)向用戶的展示,主要由HTML及JSP等完成;
MVC組件說明:
以下組件通常使用框架提供實(shí)現(xiàn):
DispatcherServlet:作為前端控制器,整個(gè)流程控制的中心,控制其它組件執(zhí)行,統(tǒng)一調(diào)度,降低組件之間的耦合性,提高每個(gè)組件的擴(kuò)展性。
HandlerMapping:通過擴(kuò)展處理器映射器實(shí)現(xiàn)不同的映射方式,例如:配置文件方式,實(shí)現(xiàn)接口方式,注解方式等。
HandlAdapter:通過擴(kuò)展處理器適配器,支持更多類型的處理器。
ViewResolver:通過擴(kuò)展視圖解析器,支持更多類型的視圖解析,例如:jsp、freemarker、pdf、excel等。
組件:
1、前端控制器DispatcherServlet(不需要工程師開發(fā)),由框架提供
作用:接收請求,響應(yīng)結(jié)果,相當(dāng)于轉(zhuǎn)發(fā)器,中央處理器。有了dispatcherServlet減少了其它組件之間的耦合度。
用戶請求到達(dá)前端控制器,它就相當(dāng)于mvc模式中的c,dispatcherServlet是整個(gè)流程控制的中心,由它調(diào)用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性。
2、處理器映射器HandlerMapping(不需要工程師開發(fā)),由框架提供
作用:根據(jù)請求的url查找Handler
HandlerMapping負(fù)責(zé)根據(jù)用戶請求找到Handler即處理器,springmvc提供了不同的映射器實(shí)現(xiàn)不同的映射方式,例如:配置文件方式,實(shí)現(xiàn)接口方式,注解方式等。
3、處理器適配器HandlerAdapter
作用:按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler
通過HandlerAdapter對處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用,通過擴(kuò)展適配器可以對更多類型的處理器進(jìn)行執(zhí)行。
4、處理器Handler(需要工程師開發(fā))
注意:編寫Handler時(shí)按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler
Handler 是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進(jìn)行處理。
由于Handler涉及到具體的用戶業(yè)務(wù)請求,所以一般情況需要工程師根據(jù)業(yè)務(wù)需求開發(fā)Handler。
5、視圖解析器View resolver(不需要工程師開發(fā)),由框架提供
作用:進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view)
View Resolver負(fù)責(zé)將處理結(jié)果生成View視圖,View Resolver首先根據(jù)邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最后對View進(jìn)行渲染將處理結(jié)果通過頁面展示給用戶。
springmvc框架提供了很多的View視圖類型,包括:jstlView、freemarkerView、pdfView等。
一般情況下需要通過頁面標(biāo)簽或頁面模版技術(shù)將模型數(shù)據(jù)通過頁面展示給用戶,需要由工程師根據(jù)業(yè)務(wù)需求開發(fā)具體的頁面。
6、視圖View(需要工程師開發(fā)jsp...)
View是一個(gè)接口,實(shí)現(xiàn)類支持不同的View類型(jsp、freemarker、pdf...)
MVC的工作原理運(yùn)用了許多東西。前端控制器減少組件之間的耦合度;處理器映射器根據(jù)請求的url查找Handler;處理器適配器按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler;視圖解析器進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view);視圖View實(shí)現(xiàn)類支持不同的View類型(jsp、freemarker、pdf...)。這里面涉及的太多專業(yè)性的東西,如果你對這些東西感興趣的話,可以自己再找其他信息來源進(jìn)行了解。想要了解更多關(guān)于MVC的信息,請繼續(xù)關(guān)注中培偉業(yè)。