22.2. DispatcherServlet

在Web MVC框架中,每一個DispatcherServlet都有本身的WebApplicationContext,它繼承了已經在根WebApplicationContext中定義的全部bean。根WebApplicationContext應該包含應該在其餘上下文和Servlet實例之間共享的全部基礎架構bean。這些繼承的bean能夠在特定於servlet的範圍內被覆蓋,您能夠在給定的Servlet實例本地定義新的範圍特定的bean。html

Spring Web MVC中的典型上下文層次結構:web

    初始化DispatcherServlet後,Spring MVC在Web應用程序的WEB-INF目錄中查找名爲spring

[servlet-name] -servlet.xml的文件,並建立在那裏定義的bean,覆蓋在全局範圍內以相同名稱定義的任何bean的定義。安全

請考慮如下DispatcherServlet Servlet的配置(在web.xml文件中):架構

<web-app>
    <servlet>
        <servlet-name>golfing</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>golfing</servlet-name>
        <url-pattern>/golfing/*</url-pattern>
    </servlet-mapping>
</web-app>

使用上述Servlet配置,您將須要在應用程序中有一個名爲/WEB-INF/golfing-servlet.xml的文件;該文件將包含您全部的Spring Web MVC特定組件(bean)。您能夠經過Servlet初始化參數更改此配置文件的確切位置(詳見下文)。mvc

單個DispatcherServlet方案也可能只有一個根上下文。app

配置文件的確切位置能夠經過設置一個空的ContextConfigLocation servlet初始化參數進行配置,以下所示:框架

<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/root-context.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

WebApplicationContext是普通ApplicationContext的擴展,它具備Web應用程序所需的一些額外功能。它與普通的ApplicationContext不一樣之處在於它可以解析主題(參見第22.9節「使用主題」),而且知道它與哪一個Servlet相關聯(經過鏈接到ServletContext)。WebApplicationContext綁定在ServletContext中,而且經過在RequestContextUtils類上使用靜態方法,您能夠隨時查找WebApplicationContext,若是您須要訪問它。post

22.2.1 WebApplicationContext中的特殊Bean類型

Spring DispatcherServlet使用特殊的bean來處理請求並呈現(render )適當的視圖。這些bean是Spring MVC的一部分。您能夠經過在WebApplicationContext中簡單配置一個或多個選擇要使用的特殊bean。可是,您最初不須要這樣作,由於Spring MVC維護一個默認bean列表,若是您沒有配置任何內容。更多的在下一節。首先看下錶列出DispatcherServlet依賴的特殊bean類型(沒有所有列出)。測試

HandlerMapping 根據一些標準將傳入的請求映射處處理程序和前處理程序和後處理程序列表(處理程序攔截器),其細節由HandlerMapping實現而異。最流行的實現支持註釋控制器,但其餘實現也存在.
HandlerAdapter 幫助DispatcherServlet調用映射到請求的處理程序,而無論實際調用哪一個處理程序。例如,調用帶註釋的控制器須要解析各類註釋。所以,HandlerAdapter的主要目的是屏蔽DispatcherServlet和這些細節。
ViewResolver 將基於邏輯字符串的視圖名稱解析爲實際的View類型。

 

22.2.2默認DispatcherServlet配置

如上一節中針對每一個特殊bean所述,DispatcherServlet會維護默認使用的實現列表。此信息保存在包org.springframework.web.servlet中的文件DispatcherServlet.properties中。

全部特殊beans都有一些合理的默認值。不久以後,您將須要自定義這些bean提供的一個或多個屬性。例如,將InternalResourceViewResolver設置的前綴屬性配置爲視圖文件的父位置是很常見的。

不管細節如何,在這裏瞭解的重要概念是,一旦您在WebApplicationContext中配置了一個特殊的bean,如InternalResourceViewResolver,您有效地覆蓋了該特殊bean類型的默認實現列表。例如,若是配置了InternalResourceViewResolver,則會忽略ViewResolver實現的默認列表。在第22.16節「配置Spring MVC」中,您將瞭解配置Spring MVC的其餘選項,包括MVC Java配置和MVC XML命名空間,這兩個命名空間都提供了一個簡單的起點,而且對Spring MVC的工做原理幾乎不瞭解。不管您如何選擇配置應用程序,本節中介紹的概念都是根本的,應該對您有所幫助。

22.2.3 DispatcherServlet處理序列

在您設置了DispatcherServlet而且針對該特定DispatcherServlet啓動了一個請求後,DispatcherServlet將按以下所示開始處理請求:

(1) 在請求中搜索並綁定WebApplicationContext做爲控件和進程中的其餘元素可使用的屬性。默認狀況下,它將在DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE鍵下綁定。

(2) 語言環境解析器被綁定到請求,以使進程中的元素可以解決在處理請求時使用的區域設置(渲染視圖,準備數據等)。若是不須要語言環境解析,則不須要它。

(3) 主題解析器被綁定到使得諸如視圖之類的元素肯定要使用哪一個主題的請求。若是不使用主題,能夠忽略它。

(4) 若是指定了多部分文件(multipart file)解析器,則會檢查該請求的多部分(multiparts);若是找到多部分,則請求被包裝在一個MultipartHttpServletRequest中,以便進程中的其餘元素進一步處理。有關多部分處理的更多信息,請參見第22.10節「Spring’s multipart (file upload) support」.

(5) 搜索適當的處理程序。若是找到一個處理程序,執行與處理器(預處理器(preprocessors),後處理器(postprocessors)和控制器(controllers))相關聯的執行鏈,以便準備模型或呈現。

(6) 若是返回模型,則呈現視圖。若是沒有返回模型(多是因爲預處理程序或後處理程序攔截請求,多是出於安全考慮),則不會呈現任何視圖,由於請求可能已經實現了(fulfilled)。

   在WebApplicationContext中聲明的處理程序異常解析程序在處理請求期間提取異常。使用這些異常解析器容許您定義自定義行爲來解決(address )異常。

Spring DispatcherServlet還支持返回由Servlet API指定的最後修改日期。肯定特定請求的最後修改日期的過程很簡單:DispatcherServlet查找適當的處理程序映射,並測試發現的處理程序是否實現了LastModified接口。若是是,則LastModified接口的long getLastModified(request)方法的值將返回給客戶端。

您能夠經過將Servlet初始化參數(init-param元素)添加到web.xml文件中的Servlet聲明來自定義單獨的DispatcherServlet實例。有關支持的參數列表,請參見下表.

表22.2。 DispatcherServlet的初始化參數

Parameter  Explanation

contextclass

實現WebApplicationContext的類,它實例化了這個Servlet使用的上下文。默認狀況下,使用XmlWebApplicationContext。

contextConfigLocation

傳遞給上下文實例(由contextClass指定)以指示能夠找到上下文的字符串。該字符串可能包含多個字符串(使用逗號做爲分隔符)來支持多個上下文。在具備兩次定義的bean的多個上下文位置的狀況下,優先級最高。

namespace

WebApplicationContext的命名空間。默認爲[servlet-name] -servlet。

相關文章
相關標籤/搜索