前言
Spring MVC框架是一個MVC框架冰评,通過實現(xiàn)Model-View-Controller模式來很好地將數(shù)據(jù)、業(yè)務(wù)與展現(xiàn)進行分離默刚。從這樣一個角度來說引几,Spring MVC和Struts、Struts2非常類似嘱丢。Spring MVC的設(shè)計是圍繞DispatcherServlet展開的薪介,DispatcherServlet負責(zé)將請求派發(fā)到特定的handler。通過可配置的handler mappings越驻、view resolution汁政、locale以及theme resolution來處理請求并且轉(zhuǎn)到對應(yīng)的視圖。
原理
上圖是Spring MVC的工作原理圖缀旁,我們先介紹一下里面出現(xiàn)的核心組件
- 前端控制器(DispatcherServlet)
它的任務(wù)是將請求發(fā)送給Spring MVC控制器记劈,在典型的應(yīng)用程序中可能會有多個控制器,因此需要根據(jù)HanderMapping查詢映射關(guān)系并巍。 - 處理器映射(HanderMapping)
主要存儲著將一個URL映射到后端控制器(Controller)的關(guān)系目木。 - 后端控制器(Controller)
主要用于具體業(yè)務(wù)處理,處理完之后一般返回一個ModelAndView懊渡,包含了響應(yīng)所需數(shù)據(jù)和URL信息等刽射。 - 視圖解析器(ViewResolver)
主要用于配置視圖解析引擎军拟,如:使用freemarker作為視圖模板。根據(jù)配置的信息可以找到具體的視圖(View) - 視圖(View)
用于展示用戶的具體使用界面
接下來誓禁,我們對上圖的具體過程做詳細介紹:
①在請求離開瀏覽器時懈息,會帶有用戶所請求內(nèi)容的信息,至少包含請求的URL摹恰。但是還可能帶有其他的信息漓拾,如用戶提交的表單信息等。
②請求先來到了前端控制器(DispatcherServlet)戒祠,前端控制器根據(jù)處理器映射(HanderMapping)查詢該請求應(yīng)該由哪個后端控制器(Controller)處理
③選擇了合適的控制器之后骇两,前端控制器(DispatcherServlet)會將請求發(fā)送給選中的后端控制器(Controller)。在后端控制器里面請求會卸下其負載(用戶提交的信息)并耐心等待控制器處理這些信息(業(yè)務(wù)邏輯可能會被委托給一個或多個服務(wù)對象)姜盈。
④后端控制器(Controller)在完成邏輯處理之后低千,通常要產(chǎn)生一些信息,這些信息需要返回給用戶并在瀏覽器上顯示馏颂。因此后端控制器(Controller)將模型數(shù)據(jù)打包示血,并且標(biāo)示出用于渲染輸出的視圖名稱(一般返回一個ModelAndView),然后發(fā)送給前端控制器(DispatcherServlet)救拉。
⑤前端控制器(DispatcherServlet)使用視圖解析器(ViewResolver)來將邏輯視圖名匹配為一個特定的視圖實現(xiàn)难审。
⑥最后一步為視圖的實現(xiàn),視圖使用模型數(shù)據(jù)渲染輸出亿絮,并通過這個輸出將響應(yīng)對象傳遞給客戶端告喊。
附:更加詳細的工作原理圖
面試常考問題
- SpringMVC與struts2的區(qū)別
1派昧、Struts2是類級別的攔截黔姜, 一個類對應(yīng)一個request上下文,SpringMVC是方法級別的攔截蒂萎,一個方法對應(yīng)一個request上下文秆吵,而方法同時又跟一個url對應(yīng),所以說從架構(gòu)本身上SpringMVC就容易實現(xiàn)restful url,而struts2的架構(gòu)實現(xiàn)起來要費勁,因為Struts2中Action的一個方法可以對應(yīng)一個url五慈,而其類屬性卻被所有方法共享纳寂,這也就無法用注解或其他方式標(biāo)識其所屬方法了。
2泻拦、由上邊原因毙芜,SpringMVC的方法之間基本上獨立的,獨享request response數(shù)據(jù)聪轿,請求數(shù)據(jù)通過參數(shù)獲取爷肝,處理結(jié)果通過ModelMap交回給框架,方法之間不共享變量,而Struts2搞的就比較亂灯抛,雖然方法之間也是獨立的金赦,但其所有Action變量是共享的,這不會影響程序運行对嚼,卻給我們編碼 讀程序時帶來麻煩夹抗,每次來了請求就創(chuàng)建一個Action,一個Action對象對應(yīng)一個request上下文纵竖。3漠烧、由于Struts2需要針對每個request進行封裝,把request靡砌,session等servlet生命周期的變量封裝成一個一個Map已脓,供給每個Action使用,并保證線程安全通殃,所以在原則上度液,是比較耗費內(nèi)存的。
4画舌、 攔截器實現(xiàn)機制上堕担,Struts2有以自己的interceptor機制,SpringMVC用的是獨立的AOP方式曲聂,這樣導(dǎo)致Struts2的配置文件量還是比SpringMVC大霹购。
5、SpringMVC的入口是servlet朋腋,而Struts2是filter(這里要指出齐疙,filter和servlet是不同的。以前認(rèn)為filter是servlet的一種特殊)乍丈,這就導(dǎo)致了二者的機制不同剂碴,這里就牽涉到servlet和filter的區(qū)別了。
6轻专、SpringMVC集成了Ajax,使用非常方便察蹲,只需一個注解@ResponseBody就可以實現(xiàn)请垛,然后直接返回響應(yīng)文本即可,而Struts2攔截器集成了Ajax洽议,在Action中處理時一般必須安裝插件或者自己寫代碼集成進去宗收,使用起來也相對不方便。
7亚兄、SpringMVC驗證支持JSR303混稽,處理起來相對更加靈活方便,而Struts2驗證比較繁瑣,感覺太煩亂匈勋。
8礼旅、Spring MVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高(當(dāng)然Struts2也可以通過不同的目錄結(jié)構(gòu)和相關(guān)配置做到SpringMVC一樣的效果洽洁,但是需要xml配置的地方不少)痘系。
9、 設(shè)計思想上饿自,Struts2更加符合OOP的編程思想汰翠, SpringMVC就比較謹(jǐn)慎,在servlet上擴展昭雌。
10复唤、SpringMVC開發(fā)效率和性能高于Struts2。
11烛卧、SpringMVC可以認(rèn)為已經(jīng)100%零配置佛纫。
參考文獻
[1]SpringMVC與Struts2區(qū)別與比較總結(jié)
[2]史上最全的SpringMVC學(xué)習(xí)筆記