DispatcherServlet詳解

来源:http://www.cnblogs.com/Zyf2016/archive/2017/02/07/6374294.html
-Advertisement-
Play Games

DispatcherServlet DispatcherServlet 和其它web框架一樣,Spring的web框架是一個請求驅動的web框架,其設計圍繞一個中心的servlet進行,它能將請求分發給控制器,並提供其它功能幫助web應用開發。然而,Spring的DispatcherServlet所 ...


DispatcherServlet

和其它web框架一樣,Spring的web框架是一個請求驅動的web框架,其設計圍繞一個中心的servlet進行,它能將請求分發給控制器,並提供其它功能幫助web應用開發。然而,Spring的DispatcherServlet所做的不僅僅是這些,它和Spring的IoC容器完全集成在一起,從而允許你使用Spring的其它功能。

下圖展示了DispatcherServlet對請求的處理流程。熟悉設計模式的讀者可能會發現DispatcherServlet應用了“Front Controller”這個模式(很多其他的主流web框架也都用到了這個模式)。

 

Spring Web MVC處理請求的工作流程

 

DispatcherServlet實際上是一個Servlet(它從HttpServlet繼承而來)。和其它Servlet一樣,DispatcherServlet定義在web應用的web.xml文件里。DispatcherServlet處理的請求必須在同一個web.xml文件里使用url-mapping定義映射。下麵的例子演示瞭如何配置DispatcherServlet

<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結尾的請求都會由名為exampleDispatcherServlet處理。這隻是配置Spring Web MVC的第一步。接下來需要配置DispatcherServlet本身和Spring Web MVC 框架用到的其他的bean。

正如在第 3.8 節 “ApplicationContext中所描述的,Spring中的ApplicationContext可以被限制在不同的作用域(scope)中。在web MVC框架中,每個DispatcherServlet有它自己的WebApplicationContext,這個context繼承了根 WebApplicationContext的所有bean定義。這些繼承的bean也可以在每個serlvet自己的所屬的域中被覆蓋(override),覆蓋後的bean可以被設置成只有這個servlet實例自己才可以使用的屬性。

 

Spring Web MVC中的Context體系

 

DispatcherServlet的初始化過程中,Spring會在web應用的WEB-INF文件夾下尋找名為[servlet-name]-servlet.xml的配置文件,生成文件中定義的bean。這些bean會覆蓋在全局範圍(global cope)中定義的同名的bean。

下麵這個例子展示了在web.xmlDispatcherServlet的配置:

<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>*.do</url-pattern>
    </servlet-mapping>
</web-app>

要進行如上的servlet配置,你還需要配置/WEB-INF/golfing-servlet.xml這樣一個文件。golfing-servlet.xml這個文件應該聲明你在Spring Web MVC 框架中需要的bean。 這個文件的路徑也可以通過web.xml中servlet的初始化參數來更改。(詳情見下麵的例子。)

WebApplicationContext僅僅是一個擁有web應用必要功能的普通ApplicationContext。它與一個標準的ApplicationContext的不同之處在於,它能夠解析theme(參考第 13.7 節 “使用主題”),並且它知道自己與哪個servlet相關聯(通過ServletContext)。WebApplicationContext被綁定在ServletContext上,當你需要的時候,可以使用RequestContextUtils提供的靜態方法找到WebApplicationContext

Spring的DispatcherServlet有一組特殊的bean,用來處理請求和渲染相應的視圖。這些bean包含在Spring的框架里,可以在WebApplicationContext中配置,配置方式與配置其它bean相同。這些bean中的每一個都在下文作詳細描述。此刻讀者只需知道它們的存在,便繼續對DispatcherServlet進行討論。對大多數bean,Spring都提供了合理的預設值,所以在開始階段,你不必擔心如何對其進行配置。

表 13.1. WebApplicationContext中特殊的bean

名稱描述
控制器(Controller) 控制器 實現的是MVC中C 那個組成部分。
處理器映射(Handler mapping) 處理器映射包含預處理器(pre-processor),後處理器(post-processor)和控制器的列表,它們在符合某種條件時才被執行(例如符合控制器指定的URL)。
視圖解析器(View resolvers) 視圖解析器 可以將視圖名解析為對應的視圖。
本地化解析器(Locale resolver) 本地化解析器能夠解析用戶正在使用的本地化設置,以提供國際化視圖。
主題解析器(Theme resolver) 主題解析器能夠解析你的web應用所使用的主題,以提供個性化的佈局。
上傳文件解析器(multipart file resolver) 上傳文件解析器提供HTML表單文件上傳功能。
處理器異常解析器(Handler exception resolver(s)) 處理器異常解析器可以將異常對應到視圖,或者實現更加複雜的異常處理代碼。

 

DispatcherServlet配置好以後,DispatcherServlet接收到與其對應的請求之時,處理就開始了。下麵的列表描述了DispatcherServlet處理請求的全過程:

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

  2. 將本地化解析器(localResolver)綁定到請求上,這樣使得處理鏈上的處理器在處理請求(準備數據、顯示視圖等等)時能進行本地化處理。若不使用本地化解析器,也不會有任何副作用,因此如果不需要本地化解析,忽略它就可以了。

  3. 將主題解析器綁定到請求上,這樣視圖可以決定使用哪個主題。如果你不需要主題,可以忽略它。

  4. 如果上傳文件解析器被指定,Spring會檢查每個接收到的請求是否存在上傳文件,如果是,這個請求將被封裝成MultipartHttpServletRequest以便被處理鏈中的其它處理器使用。(關於文件上傳的更多內容請參考第 13.8.2 節 “使用MultipartResolver。)

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

  6. 如果模型數據被返回,就使用配置在WebApplicationContext中的視圖解析器顯示視圖,否則視圖不會被顯示。有多種原因可以導致返回的數據模型為空,比如預處理器或後處理器可能截取了請求,這可能是出於安全原因,也可能是請求已經被處理過,沒有必要再處理一次。

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

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

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

表 13.2. DispatcherServlet初始化參數

參數描述
contextClass 實現WebApplicationContext介面的類,當前的servlet用它來創建上下文。如果這個參數沒有指定,預設使用XmlWebApplicationContext
contextConfigLocation 傳給上下文實例(由contextClass指定)的字元串,用來指定上下文的位置。這個字元串可以被分成多個字元串(使用逗號作為分隔符)來支持多個上下文(在多上下文的情況下,如果同一個bean被定義兩次,後面一個優先)。
namespace WebApplicationContext命名空間。預設值是[server-name]-servlet


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 委托是一個類型。C#中的委托是面向對象的,並且它是類型安全的 當創建委托實例的時候,創建的實例會包含一個調用列表,在調用列表中可以包含多個方法。每個方法稱作一個調用實體。調用實體可以是靜態方法,也可以是實例方法。如果是實例方法,則該調用實體包含調用該實例方法的實例。委托並不關心它所調用方法所屬的類, ...
  • 等待著元宵節的到來,過完元宵,這個年也算是過完了,也得開始出去掙錢了,過年回家感覺每個人都覺得很牛,只有自己太渣,為了避免年底再出現這樣尷尬的局面,還是需要努力幹活。爭取當上CEO,贏取白富美,走上人生巔峰。(生活需要幻想,也需要面對現實,努力獲取一個向上的心態,比起擁有財富要更加的難得。) 對於現 ...
  • asp.net通過文件下載框將伺服器上的指定路徑文件保存到本地指定位置 ...
  • if語句 電腦又被稱作電腦,意指電腦可以像人腦一樣,根據周圍環境條件(即expession)的變化做出不同的反應(即執行代碼)if語句就是來控制電腦實現這一功能 語法: 1.單分支,單個條件判斷 if expression: expr_true_suite 註釋:expression為真執行代 ...
  • ubuntu下配置JDK環境變數ubuntu下的JDK配置本質上和win一樣的:1、去官網下載JDK,選擇適合自己版本,我下載的版本是jdk-8u121-linunx-x64.tag.gz,官方網址http://www.oracle.com/technetwork/java/javase/downl ...
  • 前言: 最近沒什麼事做,搭個框架寫成博客記錄下來,拉通一下之前所學知識,順帶裝一下逼。 話不多說,我們直接步入正題。 準備工作: 1/安裝並配置java運行環境 2/資料庫的安裝配置(Mysql) 3/安裝並配置伺服器(Tomcat) 4/Maven 5/ IntelliJIDEA的安裝配置(本人使 ...
  • ...
  • 是在TableView 每一個 cell 的末尾都添加一個 > 符號,如圖 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...