Spring MVC 了解DispatcherServlet的處理流程

2018-07-26 15:24 更新

配置好DispatcherServlet以后,開(kāi)始有請(qǐng)求會(huì)經(jīng)過(guò)這個(gè)DispatcherServlet。此時(shí),DispatcherServlet會(huì)依照以下的次序?qū)φ?qǐng)求進(jìn)行處理:

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

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

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

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)