Spring MVC??
目前業(yè)內(nèi)使用得比較廣泛的 MVC 框架绊袋,就是 Spring MVC 框架。
Spring MVC 基礎(chǔ)知識
Spring MVC 是一款基于 MVC 架構(gòu)模式的輕量級 Web 框架皂岔,其目的是將 Web 開發(fā)模塊化展姐,對整體架構(gòu)進(jìn)行解耦剖毯,簡化 Web開發(fā)流程教馆。
Spring 體系結(jié)構(gòu)
模塊
Spring4.x 框架由大約20個模塊組成。這些模塊分為核心容器(Core Container)胶滋,數(shù)據(jù)訪問/集成(Data Access/Integration)悲敷,Web后德,切面編程(AOP),Instrumentation和Test探遵,如下圖所示箱季。
顯然棍掐,這幅圖劃分為以下五個部分:
Core Container
Core Container包含四個模塊:Core作煌,Beans,Context 和 表達(dá)式語言模塊粟誓。
- Core 和 Beans 模塊提供了框架的基本部分鹰服,包括控制反轉(zhuǎn) (IoC) 和依賴注入(Dependency Injection)功能。BeanFactory 是工廠模式的復(fù)雜實(shí)現(xiàn)套菜。它消除了對程序化單例的需求设易,并允許將實(shí)際程序邏輯中的依賴關(guān)系的配置和規(guī)范分離。
- Context模塊建立在由Core和Beans模塊提供的堅(jiān)實(shí)基礎(chǔ)上:它訪問對象的方式類似于JNDI注冊表戏溺。Context模塊從Beans模塊中繼承它的特性,并增加對國際化的支持袍睡,例如使用資源包(resource bundles)肋僧,事件傳播,資源加載止潘,以及進(jìn)行上下文的透明創(chuàng)建辫诅,例如一個 servlet 容器。Context 模塊還支持 Java EE 功能么夫,例如 EJB肤视,JMX,以及基本的遠(yuǎn)程處理腐螟。ApplicationContext接口是 Contex 模塊的核心內(nèi)容困后。
- 表達(dá)式語言模塊在運(yùn)行時為查詢和操作對象圖提供了強(qiáng)大的表達(dá)式語言摇予。它是JSP 2.1規(guī)范中指定的統(tǒng)一表達(dá)式語言(unifiedEL)的擴(kuò)展。該語言支持設(shè)置和獲取屬性值宁昭,屬性分配和方法調(diào)用救鲤,訪問數(shù)組,集合和索引器的上下文斥扛,邏輯和算術(shù)運(yùn)算符,命名變量芬失,并從Spring的IoC容器中按名稱檢索對象匾灶。它還支持列表預(yù)測和選擇以及常用列表聚合。
Data Access/Integration
數(shù)據(jù)訪問/集成層由JDBC颊糜,ORM秃踩,OXM,JMS和事務(wù)模塊(Transaction modules)組成鸟赫。
- JDBC模塊提供了一個JDBC抽象層消别,它不需要進(jìn)行繁瑣的JDBC編碼和解析(parse)數(shù)據(jù)庫供應(yīng)商特定的錯誤代碼寻狂。
- ORM模塊為流行的對象關(guān)系映射API提供了集成層,包括JPA蒿偎,JDO和Hibernate怀读。使用ORM包骑脱,你可以將所有這些O / R映射框架與Spring提供的所有其他功能結(jié)合使用叁丧,例如前面提到的簡單聲明式事務(wù)管理功能。
- OXM模塊提供了支持JAXB蚊锹,Castor稚瘾,XMLBeans,JiBX和XStream的對象/ XML映射實(shí)現(xiàn)的抽象層丢烘。
- Java消息傳遞服務(wù) (Java Messaging Service) 模塊包含用于生成和使用消息的功能。
- Transaction模塊支持編程和聲明式事務(wù)管理掸刊,用于實(shí)現(xiàn)特殊接口和所有POJO(普通Java對象, plain old Java objects)的類赢乓。
Web
Web層由Web牌芋,Web-Servlet,WebSocket和Web-Portlet模塊組成试吁。
- Spring的Web模塊提供基本的面向Web的集成功能楼咳,如多部分文件上傳功能和使用servlet偵聽器的IoC容器的初始化以及面向Web的應(yīng)用程序上下文。它還包含Spring遠(yuǎn)程支持的Web相關(guān)部分余耽。
- Web-Servlet模塊包含用于Web應(yīng)用程序的Spring MVC實(shí)現(xiàn)苹熏。Spring的MVC框架提供了域模型代碼和Web表單之間的清晰分離,并且與Spring框架的所有其他功能集成在一起袱耽。
- Web-Portlet模塊提供MVC實(shí)現(xiàn)以用于Portlet環(huán)境朱巨,并反映Web-Servlet模塊的功能枉长。
AOP and Instrumention
Spring的AOP模塊提供了符合AOP聯(lián)盟的面向切面編程(aspect-oriented programming)實(shí)現(xiàn),允許你定義方法攔截器和切入點(diǎn)洪唐,以便干凈地分離實(shí)現(xiàn)應(yīng)該分離的功能的代碼吼蚁。使用源代碼級元數(shù)據(jù)(metadata)功能,你還可以將行為信息以類似于.NET屬性的方式整合到你的代碼中功炮。
單獨(dú)的Aspects模塊提供了與AspectJ的集成薪伏。
Instrumentation模塊提供了用于某些應(yīng)用程序服務(wù)器的類工具支持和類加載器實(shí)現(xiàn)。
Test
測試模塊支持使用JUnit或TestNG測試Spring組件设捐。它提供了一致的Spring ApplicationContexts加載和緩存這些上下文塘淑。它還提供了模擬對象,你可以使用它們單獨(dú)測試你的代碼槐沼。
Spring MVC 請求流程
Spring MVC 的整體請求流程如下:
- 用戶單擊某個請求路徑岗钩,發(fā)起一個 request 請求肖油,此請求會被前端控制器 (DispatcherServlet) 處理浓领。
- 前端控制器 (DispatcherServlet) 請求處理映射器 (HandlerMapping) 去查找 Handler椒涯。可以依據(jù)注解或者 XML 配置去查找浑娜。
- 處理映射器 (HandlerMapping) 根據(jù)配置找到相應(yīng)的 Handler(可能包含若干個 Interceptor 攔截器)显拳,返回給前端控制器 (DispatcherServlet)杂数。
- 前端控制器 (DispatcherServlet) 請求處理器適配器 (HandlerAdapter) 去執(zhí)行相應(yīng)的 Handler(常稱為 Conroller)瘸洛。
- 處理器適配器 (HandlerAdapter) 執(zhí)行 Handler反肋。
- Handler 執(zhí)行完畢后會返回給處理器適配器 (HandlerAdapter) 一個 ModelAndView 對象(Spring MVC 底層對象,包括 Model 數(shù)據(jù)模型和 View 試圖信息)罕邀。
- 處理器適配器 (HandlerAdapter) 接收到 Handler 返回的 ModelAndView 后,將其返回給前端控制器 (DispatcherServlet)日熬。
- 前端控制器 (DispatcherServlet)接收到 ModelAndView 后肾胯,會請求視圖解析器 (View Resolver) 對視圖進(jìn)行解析敬肚。
- 視圖解析器 (View Resolver) 根據(jù) View 信息匹配到相應(yīng)的視圖結(jié)果,反饋給前端控制器 (DispatcherServlet) 憎亚。
- 前端控制器 (DispatcherServlet) 收到 View 具體視圖后弄慰,進(jìn)行視圖渲染,將 Model 中的模型數(shù)據(jù)填充到 View 視圖中的 request 域斋日,生成最終的視圖 (View)墓陈。
- 前端控制器 (DispatcherServlet) 向用戶返回請求結(jié)果贡必。
以上就是 Spring MVC 的整個請求處理流程,其中用到的組件有前端控制器 (DispatcherServlet) 衫樊、處理映射器 (HandlerMapping)利花、處理器適配器 (HandlerAdapter)炒事、處理器 (Handler)、視圖解析器 (View Resolver)权薯、視圖 (View)。
- 前端控制器 (DispatcherServlet):其作用是接收用戶請求黍析,然后給用戶反饋結(jié)果屎开。它的作用相當(dāng)于一個轉(zhuǎn)發(fā)器或中央處理器,控制整個流程的執(zhí)行侮繁,對各個組件進(jìn)行統(tǒng)一調(diào)度如孝,以降低組件之間的耦合性第晰,有利于組件之間的拓展。
- 處理映射器 (HandlerMapping):其作用是根據(jù)請求的 URL 路徑品抽,通過注解或者 XML 配置甜熔,尋找匹配的處理器 (Handler) 信息腔稀。
- 處理器適配器 (HandlerAdapter):其作用是根據(jù)映射器找到的處理器 (Handler) 信息,按照特定規(guī)則執(zhí)行相關(guān)的處理器 (Handler)淡喜。
- 處理器 (Handler):其作用是執(zhí)行相關(guān)的請求處理邏輯,并返回相應(yīng)的數(shù)據(jù)和視圖信息诵闭,將其封裝至 ModelAndView 對象中炼团。
- 視圖解析器 (View Resolver):其作用是進(jìn)行解析操作,通過 ModelAndView 對象中的 View 信息將邏輯視圖名解析成真正的視圖 View(如通過是個 JSP 路徑返回一個真正的 JSP 頁面)疏尿。
- 視圖 (View):其本身是一個接口瘟芝,實(shí)現(xiàn)類支持不同的 View 類型(JSP、FreeMarker润歉、Excel等)模狭。
上面的組件中,需要開發(fā)人員進(jìn)行開發(fā)的是處理器和視圖踩衩。一般來講嚼鹉,要開發(fā)處理該請求的具體代碼邏輯驱富,以及最終展示給用戶的界面锚赤。
Spring MVC 與 Structs
Struts 與 Spring MVC 類似,也是一款基于傳統(tǒng) MVC 設(shè)計模式的 Java EE 框架褐鸥。它的核心是一個彈性的控制層线脚,能夠很好地發(fā)揮 MVC 模式的“分離顯示邏輯和業(yè)務(wù)邏輯”的能力。
Spring MVC 和 Struts 都是基于 MVC 模式的 Java EE 框架叫榕,而今年來越來越多的開發(fā)者使用 Spring MVC 技術(shù)來代替 Struts 技術(shù)浑侥,那么相比于 Struts 框架,Spring MVC 的優(yōu)點(diǎn)在哪里呢晰绎?
區(qū)別一:Spring MVC基于方法開發(fā)寓落,Struts 基于類開發(fā)。
在使用 Spring MVC 框架開發(fā)時荞下,會將 URL 請求路徑與 Controller 類的某個方法進(jìn)行綁定伶选,請求參數(shù)作為該方法的形參。當(dāng)用戶請求該 URL 路徑時尖昏,Spring MVC 會將 URL 信息與 Controller 類的某個方法進(jìn)行映射仰税,生成一個 Handler 對象,該對象中只包含了一個 method 方法抽诉。方法執(zhí)行結(jié)束之后陨簇,形參數(shù)據(jù)也會被銷毀。
而在使用 Struts 框架進(jìn)行開發(fā)時迹淌,Action 類中所有方法使用的請求參數(shù)都是 Action 類中的成員變量塞帐,隨著方法變得越來越多,就很難分清楚 Action 中那么多的成員變量到底是給哪一個方法使用的巍沙,整個 Action 類會變得十分混亂葵姥。
比較而言,Spring MVC 的優(yōu)點(diǎn)是句携,其所有請求參數(shù)都會被定義為相應(yīng)方法的形參榔幸,用戶在網(wǎng)頁上的請求路徑會被映射到 Controller 類對應(yīng)的方法上,此時請求參數(shù)會注入到對應(yīng)方法的形參上矮嫉。Spring MVC 的這種方式類似于 Service 開發(fā)削咆。
區(qū)別二:Spring MVC 可以進(jìn)行單例開發(fā),Struts 無法使用單例蠢笋。
Spring MVC 支持單例開發(fā)模式拨齐,而 Struts 由于只能通過類的成員變量接受參數(shù),所以無法使用單例模式昨寞,只能使用多例瞻惋。