天天看點

第一章 Spring MVC 4概述

    說明:此系列文章為部落客原創翻譯,轉載請注明:http://blog.csdn.net/hugh282003/article/details/19031455

    Spring MVC以DispatcherServlet為核心,通過DispatcherServlet轉發用戶端請求交由控制器處理,架構提供了可配置的控制器映射管理,視圖解析管理,地區、時區和主題解析管理以及對檔案上傳的支援等。

    對用戶端請求的處理,預設是交由基于@Controller和@RequestMapping注解的控制器來處理,在這個控制器裡提供了一系列靈活的對不同請求的處理方法。通過@Controller注解這種控制器實作機制,Spring MVC也可以實作具有RESTful風格的應用,這是通過@PathVariable注解以及架構的其他特征來提供的。

    在Spring MVC中,任何對象都可作為指令或表單對象來使用,無需去實作架構指定的接口或繼承一個父類。架構的資料綁定機制是非常靈活的,比如,架構把資料類型不比對當作校驗錯誤而不是系統錯誤來處理,這樣程式就可以利用這種校驗錯誤來做一些工作。通過這樣一種處理機制,我們無需為了處理用戶端的無效請求參數或是對參數的字元串化而在業務對象和表單對象之間進行複制工作。架構可以直接在請求參數和業務對象之間進行資料綁定。

    Spring MVC的視圖解析機制也是異常靈活的。控制器不隻是可以提供資料modelMap和選擇視圖名稱,也可以直接寫資料到響應流進而完成整個請求處理。通過檔案擴充名或請求頭的内容類型(content type)約定,或是bean的名稱,properties檔案甚至是自定義的ViewResolver實作類,架構對視圖名稱的解析是高度可配置的。架構的模型部分是一個Map接口,實作了對視圖的完全抽象。視圖層可以直接內建諸如JSP、Velocity和Freemarker等模闆展示技術,或是直接使用XML、JSON、Atom以及其他類型的内容顯示技術。模型層的Map會被轉換成合适的類型,比如JSP的請求參數或Velocity的模闆參數等。

    1.1 Spring MVC 4的主要特性:

    1、清晰的角色分離。架構的每個角色,如控制器、校驗器、指令對象、表單對象、模型對象、DispatcherServlet、控制器映射器、視圖解析器等等,都是通過一個專門的對象來負責的。

    2、架構的處理類和應用的業務類都可以作為JavaBean來配置。這種可配置性使得跨上下文引用更加簡單,例如從控制器到業務對象和校驗器之間的引用。   

    3、适應性、非侵入性和靈活性。控制器的方法簽名定義是非常靈活的,根據不同場景可以使用諸如@RequestParam、@RequestHeader和@PathVariable等方法參數注解。

    4、可重用的業務邏輯,無需複制。已有的業務對象就可直接作為指令或表單對象使用,而無需再複制一份以繼承某一個架構的基類。

    5、資料綁定和校驗處理可自定義實作。資料類型的不比對是作為應用程式級别的校驗錯誤來處理,在校驗的結果裡儲存了不合法的值、本地化的日期以及數字的綁定等等資訊,而不用把表單對象的屬性全部作為字元串,然後再手工解析和轉換成業務對象的相應屬性。

    6、可自定義的控制器映射器和視圖解析器。控制器映射和視圖解析機制包括簡單的基于URL的配置到複雜的特定的解析政策。在這一點,Spring比其他使用了某一特殊技術的Web MVC架構要靈活得多。

    7、靈活的模型傳輸。模型傳輸以鍵值對的Map進行,支援與任何視圖技術的內建。

    8、可自定義的地區、時區和主題解析機制,支援使用或不使用Spring标簽庫的JSP,JSTL以及與Velocity的無縫內建等等。

    9、簡單且強大的JSP标簽庫(也稱為Spring标簽庫),提供了對諸多特性的支援,比如資料綁定和主題等。在标記語言方面,可自定義的标簽提供了極大的靈活性。關于标簽描述符的更多資訊,請參考spring.tld檔案。

    10、Spring 2.0引入的JSP表單标簽庫使得編寫JSP頁面的表單更加簡單。關于表單标簽描述符的更多資訊,請參考spring-form.tld檔案。

    11、Bean的生命周期範圍為目前的HTTP請求或會話。這一點并非是Spring MVC架構本身特有的一個特性,更确切地說是Spring MVC架構使用的WebApplicationContext容器所屬的特性。關于Bean的生命周期範圍的較長的描述将會在後面的章節說明。

    1.2 與其他MVC實作的可內建性

    對于某些項目來說,采用非Spring MVC的實作可能更加合适,比如Struts和JSF,這兩個架構在已有的項目中使用的比較廣泛。如果不想使用Spring的Web MVC架構,但是想使用Spring的其他解決方案,則可以輕松地把你選擇的MVC架構與Spring進行內建。比如與Struts的內建,則可以這樣做:通過Spring的ContextLoaderListener啟動Spring應用程式上下文(root application context),然後在Struts的Action類中就可以通過ServletContext屬性或Spring提供的工具類來擷取到ApplicationContext或WebApplicationContext。不需要借助插件,是以也就不需要進行專門的內建處理。是以,我們可以把Spring當作一個庫來使用,隻是把應用程式上下文(root application context)的執行個體來作為使用Spring架構的入口點。

    你可以不依賴Spring Web MVC而自由地使用注冊的Bean和Spring的服務。Spring架構解決了很多專門的Web MVC架構沒有解決的問題,比如Bean的配置、資料通路、事務處理等。是以,在你的應用裡,Spring可以被用來作為中間層或資料通路層,甚至你隻是想使用其中的一個特性,比如對JDBC或Hibernate的事務抽象機制。