Spring MVC : WebMVC和Spring MVC框架

WebMVC和Spring MVC框架

WebMVC的基本任務

咱們先來講一下WebMVC框架的基本任務。在Web應用中,前臺負責捕捉用戶的動做、展現系統的通常界面和處理結果,後臺則主要負責系統的邏輯層面的處理,前臺和後臺一塊兒爲系統和用戶的交互、數據的處理服務,並最終構建出完整的Web應用。
在這個目的的基礎上,咱們先來看看Java技術下的Web應用的早期是怎麼處理這個問題的。html

1.servlet時期:Web請求經過前端的html頁面提交到後臺servlet,servlet對請求進行處理、運行相關邏輯,經過輸出html語句生成展現處理結果的頁面回到前端,用戶和系統之間的交互創建在繁瑣的Web頁面的生成基礎上。
2.jsp(Java Server Page)時期:Web請求經過前端的jsp頁面提交到後臺邏輯的servlet或者jsp處理單元(jsp頁面和servlet沒有本質區別,前者執行的時候是會被編譯成後者的),後臺處理後處理結果放入相應的http請求數據保存區,再將這個Web請求轉發到某個事先寫就的jsp頁面,jsp頁面把須要的數據寫入到自身並展現出來(在服務器後臺實際上還有這樣自動完成的步驟:編譯成臨時servlet,再經過輸出html語句生成展現處理結果的頁面回到前端)。這樣系統的後臺是創建在功能不甚清晰的servlet和jsp處理單元之上的。
3.servlet+jsp時期:這是MVC思想在Web開發中的起點。servlet只被看成後臺處理單元,而jsp頁面只被看成前臺展現和交互頁面而不參與後臺邏輯處理。Web請求經過jsp頁面提交到後臺,後臺servlet則負責處理邏輯,後臺處理後處理結果放入相應的http請求數據保存區,再將這個Web請求轉發到某個事先寫就的jsp頁面,jsp頁面把須要的數據寫入到自身並展現出來。和jsp時期雖然看似相同,可是因爲清楚劃分了servlet的controller控制器做用、jsp的view視圖的做用,(固然在後臺還有model數據模型),使得Web開發可以結構化地進行,系統層次也更爲清晰。前端

那麼咱們來講明一下究竟什麼是Web的MVC架構(固然除了在Web領域,大多數的用戶系統交互中都會有MVC架構的影子)。M(Model數據模型)V(View視圖)C(Controller),是Web應用的開發策略和Web應用實際運行的基本模型,大致說來就是這樣的過程:請求經過V發送到後端C,C接收到請求後選擇適當的M進行數據處理,處理完畢後C選擇合適的V進行展示。
這個模型稱爲JSP Model2,是MVC模型的基本原理,以下圖所示:web

clipboard.png

Spring MVC框架的區別和優點

如上所述的基本MVC框架看起來已經知足咱們的一半需求了,那麼咱們所說的使用包括像Spring MVC這樣的WebMVC框架有什麼好處呢?spring

在JSP Model 2 這個經典WebMVC模型裏面,咱們的serlet和Web請求是一一映射的而且硬配置在Web應用的配置文件中的,所以系統的需求增長致使映射關係的增長再致使Web應用自己的體積增長,缺少通常性、易管理性和可重用性。這樣的問題勢必會增長系統的維護難度。
因此,使用一個集中控制器對Web請求進行分析而且選擇合適的邏輯處理Controller來處理Web請求,將硬編碼在配置文件中的映射關係寫在這個集中Controller中,這種作法仍然會使得硬編碼的問題,只不過是把硬編碼轉向了集中Controller中。後端

Spring MVC在Web請求和咱們所說的這個控制器Controller之間使用了一個很是關鍵的節點--前置控制器(Front Controller),前置控制器的做用是接收全部的Web請求並將請求派發到不一樣的頁面控制器(Page Controller),而頁面控制器就是咱們前面所說的這種通常意義上的Controller,亦即真正進行後段頁面處理邏輯的控制器。因爲引入了新的映射處理器、頁面渲染器等,存在於JSP Model 2的耦合和硬編碼問題可以得以解決,另外加上Spring自身的IOC特性,能夠將組件在容器啓動的時候就注入,實現組件的初始化前置。
以下圖所示爲Spring MVC的模型狀況:服務器

clipboard.png

Spring MVC框架的IOC加載原理

Spring MVC結合Spring自身的特性和WebMVC的模型,可以將Web應用的開發實現得更簡潔輕快,使得可複用性獲得更好的發展。下面是Spring MVC的幾個重要角色:架構

DispatcherServlet(前置控制器):將Web請求統一發送至此,把請求發送至HandlerMapping
HandlerMapping(映射處理器):接收請求並分析請求-處理器映射關係,把請求發送到Controller
Controller(頁面控制器):接收被派發的請求,真正處理業務邏輯,並將處理數據發往ViewSolver
ViewResolver(視圖配發器):統一的視圖配發器和具體的視圖模版技術無關,按照視圖配發器的配置項將數據添加到指定視圖模版技術的View中
View(視圖):真正展示數據的頁面視圖
這些角色參與整個WebMVC的流程如圖所示:app

clipboard.png

在知曉了這些角色以後咱們再來講SpringMVC的這些角色在Web容器中的初始化過程,在這裏咱們使用一個相對有通用性的例子來講明其中很是重要的組件:框架

ROOT WebApplicationContext 和 ContextLoaderListener

像全部的Spring IOC容器啓動注入業務組件同樣,Spring MVC框架也有一個主要的IOC容器用於加載注入組件,這個IOC容器就是頂層的ROOT WebApplicationContext,它經過默認位置在/WEB-INF路徑下的applicationContext做爲配置文件來進行加載,加載的契機固然在Web應用啓動的時候,所以咱們須要在做爲這個Web應用的總體描述文件web.xml定義一個監聽器ContextLoaderListerner,監聽器在Web應用啓動以後加載ROOT WebApplicationContext,加載的WebApplicationContext中主要會注入DAO、Services和數據源這些業務對象。jsp

Spring WebApplicationContext 和 DispatcherServlet

在SpringMVC架構中加入了一個爲SpringWeb應用層組件打造的IOC容器,咱們不妨稱之爲Spring WebApplicationContext,這個IOC容器是ROOT WebApplicationContext的子容器,換言之,它是能夠訪問到父容器中的注入對象的,也所以,其中注入的頁面控制器對象Controller能夠注入父容器中已經注入的Services和DAO對象。一樣的,咱們須要在web.xml中定義一個前置控制器servlet DispatcherServlet來接管全部符合定義的Web請求,並經過默認位置在/WEB-INF路徑下的<servlet-name>-servlet做爲配置文件來加載Spring WebApplicationContext,這個IOC容器存在的意義在於區分ROOT IOC和Spring IOC的職責須要,主要注入Controller,HandlerMapping,ViewResolver等SpringWeb層服務組件。

解釋了對SpringMVC架構相當重要的兩個IOC容器和加載它們的組件、IOC的注入配置文件和注入的組件類型,咱們來看看在具體的SpringMVC項目中是怎麼寫的。

Spring MVC框架的使用

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app...>
    <!--啓動監聽器加載ROOT WebApplicationContext-->
    <listener>
        <listener-class>
            org.springframework.Web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <!--前置控制器加載Spring WebApplicationContext-->
    <servlet>
        <servlet-name>
            springDispcher
        </servlet-name>
        <servlet-class>
            org.springframework.Web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>
            springDispcher
        </servlet-name>
        <url-pattern>
            *.do
        </url-pattern>
    </servlet-mapping>
</web-app>

/WEB-INF/applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans...>
    <bean id="someService" class="org.myconmpany.service.SomeService">
    </bean>
    <bean id="someDao" class="org.myconmpany.dao.SomeDao">
    </bean>
</beans>

/WEB-INF/springDispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans...>
    <bean id="handlerMapping" class="org.springframework.Web.servlet.handler.BeanNameUrlHanlerMapping">
    </bean>
    <bean name="/someLink.do" class="org.myconmpany.controller.SomeController">
    </bean>
    <bean id="viewResolver" class="org.springframework.Web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/*"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

這就是Spring MVC的基本概況,可是在精簡的開發過程當中咱們更傾向於使用Spring爲咱們準備的基於註解的開發,這樣作能夠大大減小配置文件的規模,讓Spring爲咱們自動完成一些機械性的工做。

相關文章
相關標籤/搜索