DispatcherServlet詳解

爲何咱們須要DispatcherServlet

咱們想要將外部的請求分發處理。html

DispatcherServlet是什麼

DispatcherServlet是前端控制器設計模式的實現,提供了Spring Web MVC的集中訪問點, 並且負責職責的分派,並且與Spring Ioc容器無縫集成, 從而能夠獲的Spring的全部好處。前端

DispatcherServlet做用

DispatcherServlet主要用做職責調度工做,自己主要用於控制流程,主要職責以下:web

  1. 文件上傳解析,若是請求類型是multipart將經過MultipartResolver進行文件上傳解析;
  2. 經過HandlerMapping,將請求映射處處理器(返回一個HandlerExecutionChain,它包括一個處理器、多個HandlerInterceptor攔截器);
  3. 經過HandlerAdapter支持多種類型的處理器(HandlerExecutionChain中的處理器);
  4. 經過ViewResolver解析邏輯視圖名到具體視圖實現;
  5. 本地化解析;
  6. 渲染具體的視圖等;
  7. 若是執行過程當中遇到異常將交給HandlerExceptionResolver來解析。

DispatcherServlet的工做流程

DispatcherServlet實現詳解

DospatcherServlet其實是一個Servlet(它繼承HttpServlet)。DispatcherServlet處理的請求必須在同一個web.xml文件裏使用url-mapping定義映射。這是標準的J2EE servlet配置。下面的例子展現瞭如何配置DispatcherServlet。 DispatcherServlet配置在web.xml文件中。配置文件以下。spring

<web-app>

    <servlet>
        <servlet-name>example</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>example</servlet-name>
        <url-pattern>*.form</url-pattern>
    </servlet-mapping>

</web-app>
複製代碼

在上述例子中全部以.form結尾的請求都會由名爲example的DispatcherServlet處理。這只是配置Spring Web MVC的第一步。接下來你須要配置DispatcherServlet自己和Spring Web MVC框架所須要的各類bean。設計模式

3.13 Additional Capabilities of the ApplicationContext的定義中,Spring中的ApplicationContext能夠被限制在不一樣的做用域(scope)中。在Web MVC框架中,每一個DispatcherServlet有它本身的WebApplicationContext,這個context繼承了WebApplicationContext的全部bean定義。繼承的這些bean能夠在每一個servlet本身所屬的域中被覆蓋,覆蓋的bean能夠被設置成只有這個servlet實例本身才可使用的屬性。安全

Spring Web MVC中的上下文層次結構

在初始化DispatcherServlet過程當中,框架首先在WEB-INF目錄下找到名字叫[servlet-name]-servlet.xml的文件,建立其中定義的bean,這些bean會覆蓋全局範圍中定義的同名bean。bash

咱們能夠看一下下面這個DispatcherServlet例子markdown

<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>
複製代碼

若是想要上述的配置生效,咱們須要配置一個/WEB-INF/golfing-servlet.xml文件。這個文件中聲明瞭你在Spring Web MVC框架中須要的特殊的組件(bean)。 這個文件的路徑也能夠經過web.xml中servlet的初始化參數來更改。mvc

WebApplicationContext是一個普通的ApplicationContext的擴展,可是它有一個Web應用必要的功能。它與一個標準的ApplicationContext不一樣之處在於,它可以解析主題(參考 Using themes),而且它知道本身與哪一個servlet相關聯(經過ServletContext)。WebApplicationContext被綁定在ServletContext上,當你須要的時候,可使用RequestContextUtils提供的靜態方法找到WebApplicationContext。app

Spring DispatcherServlet使用特殊的bean來處理請求和渲染視圖。這些bean是Spring框架的一部分,如同你配置其餘bean同樣,你能夠在WebApplicationContext中配置他們。對大多數bean,Spring都提供了合理的缺省值,因此在開始階段,你沒必要擔憂如何對其進行配置。

在WebApplicationContext中的特殊的bean

Bean類型 解釋
控制器(Controller) MVC 中的 c 部分
處理器映射(Handler mapping) 處理預處理器、後置處理器和控制器列表的執行(若是知足特定的條件,如:符合控制器的指定的URL)
視圖解析器(View resolvers) 將視圖名解析爲視圖
本地化解析器(Locale resolver) 本地化解析器是一個可以解析客戶端正在使用的本地配置的組件,以提供國際化視圖
主題解析器(Theme resolver) 主題解析器可以解析你的web應用所使用的主題,以提供個性化的佈局
上傳文件解析器(multipart file resolver) 上傳文件解析器提供HTML表單文件上傳功能
異常處理解析器(Handler exception resolvers) 異常處理解析器能夠將異常對應到視圖,或者實現更加複雜的異常處理代碼

處理流程

當你配置好DispatcherServlet後,DispatcherServlet接收到與其對應的請求之時,處理就開始了。處理流程以下:

  1. 找到WebApplicationContext並將其綁定到請求的一個屬性上,以便控制器和處理鏈上的其它處理器能使用WebApplicationContext。默認的屬性名爲 DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE

  2. 將本地化解析器綁定到請求上,這樣使得處理鏈上的處理器在處理請求(準備數據、顯示視圖等等)時能進行本地化處理。若是不須要本地化解析,忽略它就能夠了。

  3. 將主題解析器綁定到請求上,這樣視圖能夠決定使用哪一個主題。若是你不須要主題,能夠忽略它。

  4. 若是你指定了一個上傳文件解析器,Spring會檢查每一個接收到的請求是否存在上傳文件,若是是,這個請求將被封裝成MultipartHttpServletRequest以便被處理鏈中的其它處理器使用。(Spring's multipart (fileupload) support查看更詳細的信息)

  5. 找到合適的處理器,執行和這個處理器相關的執行鏈(預處理器,後處理器,控制器),以便爲視圖準備模型數據。

  6. 若是模型數據被返回,就使用配置在WebApplicationContext中的視圖解析器顯示視圖,不然視圖不會被顯示。有多種緣由能夠致使返回的數據模型爲空,好比預處理器或後處理器可能截取了請求,這多是出於安全緣由,也多是請求已經被處理過,沒有必要再處理一次。

在請求處理過程當中拋出的異常,能夠被任何定義在WebApplicationContext中的異常解析器所獲取。使用這些異常解析器,你能夠在異常拋出時根據須要定義特定行爲。

Spring的DispatcherServlet也支持返回Servlet API定義的last-modification-date。決定某個請求最後修改的日期很簡單:DispatcherServlet會首先尋找一個合適的handler mapping,檢查從中取得指定的處理器是否實現了LastModified接口,若是是,將調用long getLastModified(request)方法,並將結果返回給客戶端。

你能夠經過兩種方式定製Spring的DispatcherServlet:在web.xml文件中增長添加context參數,或servlet初始化參數。下面是目前支持的參數。

DispatcherServlet初始化參數

參數 描述
contextClass 實現WebApplicationContext接口的類,當前的servlet用它來建立上下文。若是這個參數沒有指定,默認使用XmlWebApplicationContext。
contextConfigLocation 傳給上下文實例(由contextClass指定)的字符串,用來指定上下文的位置。這個字符串能夠被分紅多個字符串(使用逗號做爲分隔符)來支持多個上下文(在多上下文的狀況下,若是同一個bean被定義兩次,後面一個優先)。
namespace WebApplicationContext命名空間。默認值是[server-name]-servlet。

參考

相關文章
相關標籤/搜索