1. 程式人生 > >Spring MVC 用DispatcherServlet處理請求

Spring MVC 用DispatcherServlet處理請求

SpringMVC框架和其他web的MVC框架一樣:請求驅動;所有設計都圍繞一個servlet展開,它負責把所有的請求都分發到控制器,同時提供其他web開發需要的功能。作為Spring的中央處理器,DispatcherServlet做的更多。它與Spring IOC無縫整合,spring的任何特性,在springMVC中都可以使用。

DispatcherServlet是一個前端控制器的設計模式,處理流程如下:(圖片來源於網路)

DispatcherServlet就是這個servlet,繼承自HttpServlet,需要在web.xml中配置,例如:

<web-app>
    <servlet>
        <servlet-name>helloWorld</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>helloWorld</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

配置好DispatcherServlet之後,請求經過這個servlet,會按照以下流程處理:

收到一個http請求之後,DispatcherServlet根據HandlerMapping來選擇並且呼叫適當的控制器。

控制器接受請求後,處理器介面卡呼叫處理器程序處理,並給予使用的GET、Post方法適當的呼叫service方法,service方法將設定基於定義的業務邏輯的模型資料,並返回ModelAndView到DispatcherServlet。

DispatcherServlet會從ViewResolver獲取幫助,獲取檢視。

檢視確定後,把模型資料傳遞給檢視,渲染,然後呈現在瀏覽器。

這是最基本的流程,其實還有一些操作是我們不必要關心的,如下是整個複雜的流程:

首先、搜尋對應的上下文物件webApplicationContext,並把它作為一個屬性繫結到請求上,以便控制器和其他元件能夠使用它,屬性的鍵名預設為:DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE。

將地區(local)解析器繫結到請求上,以便在處理時獲得區域相關的資訊。

將主題(theme)解析器繫結到請求上,以便其他元件處理請求時能夠知道渲染那個主題檔案。

如果你配置了multipart檔案處理器,那麼框架將查詢該檔案是不是multipart(分為多個部分連續上傳)。若是,則將該請求包裝成一個MultipartHttpServletRequest

物件,以便處理鏈中的其他元件對它做進一步的處理。

該請求查詢一個合適的處理器。如果可以找到對應的處理器,則與該處理器關聯的整條執行鏈(前處理器、後處理器、控制器等)都會被執行,以完成相應模型的準備或檢視的渲染

如果處理器返回的是一個模型(model),那麼框架將渲染相應的檢視。若沒有返回任何模型(可能是因為前後的處理器出於某些原因攔截了請求等,比如,安全問題),則框架不會渲染任何檢視,此時認為對請求的處理可能已經由處理鏈完成了。