Spring MVC 了解DispatcherServlet的處理流程

2018-07-26 15:24 更新

配置好DispatcherServlet以后,開始有請求會經(jīng)過這個DispatcherServlet。此時,DispatcherServlet會依照以下的次序?qū)φ埱筮M(jìn)行處理:

  • 首先,搜索應(yīng)用的上下文對象WebApplicationContext并把它作為一個屬性(attribute)綁定到該請求上,以便控制器和其他組件能夠使用它。屬性的鍵名默認(rèn)為DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE
  • 將地區(qū)(locale)解析器綁定到請求上,以便其他組件在處理請求(渲染視圖、準(zhǔn)備數(shù)據(jù)等)時可以獲取區(qū)域相關(guān)的信息。如果你的應(yīng)用不需要解析區(qū)域相關(guān)的信息,忽略它即可
  • 將主題(theme)解析器綁定到請求上,以便其他組件(比如視圖等)能夠了解要渲染哪個主題文件。同樣,如果你不需要使用主題相關(guān)的特性,忽略它即可
  • 如果你配置了multipart文件處理器,那么框架將查找該文件是不是multipart(分為多個部分連續(xù)上傳)的。若是,則將該請求包裝成一個MultipartHttpServletRequest對象,以便處理鏈中的其他組件對它做進(jìn)一步的處理。關(guān)于Spring對multipart文件傳輸處理的支持,讀者可以參考Spring MVC 提供multipart(文件上傳)支持一小節(jié)
  • 為該請求查找一個合適的處理器。如果可以找到對應(yīng)的處理器,則與該處理器關(guān)聯(lián)的整條執(zhí)行鏈(前處理器、后處理器、控制器等)都會被執(zhí)行,以完成相應(yīng)模型的準(zhǔn)備或視圖的渲染
  • 如果處理器返回的是一個模型(model),那么框架將渲染相應(yīng)的視圖。若沒有返回任何模型(可能是因?yàn)榍昂蟮奶幚砥鞒鲇谀承┰驍r截了請求等,比如,安全問題),則框架不會渲染任何視圖,此時認(rèn)為對請求的處理可能已經(jīng)由處理鏈完成了

如果在處理請求的過程中拋出了異常,那么上下文WebApplicationContext對象中所定義的異常處理器將會負(fù)責(zé)捕獲這些異常。通過配置你自己的異常處理器,你可以定制自己處理異常的方式。

Spring的DispatcherServlet也允許處理器返回一個Servlet API規(guī)范中定義的 最后修改時間戳(last-modification-date) 值。決定請求最后修改時間的方式很直接:DispatcherServlet會先查找合適的處理器映射來找到請求對應(yīng)的處理器,然后檢測它是否實(shí)現(xiàn)了 LastModified 接口。若是,則調(diào)用接口的long getLastModified(request)方法,并將該返回值返回給客戶端。

你可以定制DispatcherServlet的配置,具體的做法,是在web.xml文件中,Servlet的聲明元素上添加一些Servlet的初始化參數(shù)(通過init-param元素)。該元素可選的參數(shù)列表如下:

可選參數(shù)解釋
contextClass任意實(shí)現(xiàn)了WebApplicationContext接口的類。這個類會初始化該servlet所需要用到的上下文對象。默認(rèn)情況下,框架會使用一個XmlWebApplicationContext對象。
contextConfigLocation一個指定了上下文配置文件路徑的字符串,該值會被傳入給contextClass所指定的上下文實(shí)例對象。該字符串內(nèi)可以包含多個字符串,字符串之間以逗號分隔,以此支持你進(jìn)行多個上下文的配置。在多個上下文中重復(fù)定義的bean,以最后加載的bean定義為準(zhǔn)
namespaceWebApplicationContext的命名空間。默認(rèn)是[servlet-name]-servlet


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號