2010-05-04 72 views

回答

148

的DispatcherServlet的任務是採取傳入的URI,並找到處理程序的正確組合和觀點(一般的JSP),其結合形成的應該頁面或資源(通常在控制器類的方法)在那個地方找到。

我可能有

  • 文件/WEB-INF/jsp/pages/Home.jsp
  • ,並在類方法

    @RequestMapping(value="/pages/Home.html") 
    private ModelMap buildHome() { 
        return somestuff; 
    } 
    

調度的servlet是位 「知道」在瀏覽器需要時調用該方法對頁面進行測試,並將其結果與匹配的JSP文件組合起來製作一個html文檔。

它是如何實現這個配置和Spring版本差異很大。

也沒有理由最終結果必須是網頁。它可以做同樣的事情找到RMI端點,處理SOAP請求,任何可以進入servlet的東西。

+2

偉大的回報,現在是一個問題,DispatcherServlet如何識別類名稱和方法名稱。你可以給我看一個配置的例子,我有兩個類和兩個方法名,以及DispatcherServlet如何捕獲正確的請求。 – Kevin 2010-05-04 23:04:22

+8

它實際上掃描該註釋啓動時的類路徑,並將「/pages/Home.html」映射到Class +方法。如果你有兩個方法都有「/pages/Home.html」,在註解中沒有其他限制,那將是一個錯誤,它會拋出異常。 如果你是老學校,你也可以用XML連接它。 – Affe 2010-05-04 23:08:13

+0

使用Annotation Based'@ RestController'時,我們是否需要'Dispatcher Servlet' xml文件? – viper 2016-06-13 09:47:21

39

DispatcherServlet是Spring MVC的front controller pattern的實現。

請參閱Spring文檔中的說明here

本質上,它是一個接收傳入請求的servlet,並將該請求的處理委託給多個處理程序之一,其映射在DispatcherServlet配置中特定。

+0

是否像Flex中的事件,我從一個MXML到另一個或服務器獲取調度事件。 我的應用程序中可以有多個DispatcherServlet嗎? 每個類文件都有一個單獨的DispatcherServlet。 – Kevin 2010-05-04 22:55:10

+0

通常只有一個前端控制器。這與您擁有的模型和視圖無關。它只是將具體的模型和觀點放在一起。 – BalusC 2010-05-04 22:57:08

+2

@theband:如果你的架構變得更有意義,你可以擁有多個DispatcherServlets,但通常沒有理由。 – skaffman 2010-05-04 22:58:07

5

我們可以說像DispatcherServlet照顧了Spring MVC中的所有內容。

在Web容器啓動時:

  1. DispatcherServlet將通過調用 init()方法
  2. DispatcherServletinit()會嘗試與命名慣例來春 配置文檔一樣 "servlet_name-servlet.xml"那麼所有被加載和初始化豆類可以被識別。

實施例:

public class DispatcherServlet extends HttpServlet { 

    ApplicationContext ctx = null; 

    public void init(ServletConfig cfg){ 
     // 1. try to get the spring configuration document with default naming conventions 
     String xml = "servlet_name" + "-servlet.xml"; 

     //if it was found then creates the ApplicationContext object 
     ctx = new XmlWebApplicationContext(xml); 
    } 
    ... 
} 

所以,在通常DispatcherServlet捕獲請求URI和移交給HandlerMappingHandlerMapping用控制器的方法搜索映射bean,其中控制器返回邏輯名稱(視圖)。然後這個邏輯名稱被HandlerMapping發送到DispatcherServlet。然後DispatcherServlet告訴ViewResolver通過追加前綴和後綴來給出完整的視圖位置,然後DispatcherServlet給予客戶端視圖。

+0

這是一個很好的解釋。您的第2點表示DispatcherServlet將嘗試使用命名約定來標識Spring配置文檔,例如「servlet_name-servlet.xml」。但是,我看到只使用「調度員」這樣的名稱的項目,並且工作正常。我也嘗試過。但我不知道爲什麼? – 2016-12-21 12:20:44

27

在Spring MVC中,所有傳入的請求都經過一個servlet。這個servlet - DispatcherServlet - 是前端控制器。前端控制器是Web應用程序開發中的典型設計模式。在這種情況下,單個servlet接收所有請求並將它們傳送給應用程序的所有其他組件。

DispatcherServlet的任務是向特定的Spring MVC控制器發送請求。

一般我們有很多控制器和DispatcherServlet是指下列映射器中的一個,以便確定所述目標控制器:

如果沒有執行配置,則DispatcherServlet默認使用BeanNameUrlHandlerMappingDefaultAnnotationHandlerMapping

當目標控制器被識別時,DispatcherServlet向它發送請求。控制器根據請求 (或將其委託給其他對象)執行一些工作,並返回帶有模型和視圖名稱的DispatcherServlet

視圖的名稱只是一個邏輯名稱。然後使用此邏輯名稱搜索實際視圖(以避免與控制器和特定視圖耦合)。然後DispatcherServlet引用ViewResolver並將視圖的邏輯名稱映射到視圖的特定實現。

ViewResolver的一些可能的實施是:

DispatcherServlet確定將顯示結果的視圖時,它將呈現爲響應。

最後,DispatcherServletResponse對象返回給客戶端。

12
  • 的Spring Web MVC框架的的DispatcherServlet是FrontController的實現,是一個Java Servlet組件。即它是Spring Web Mvc應用程序的servlet前端。

  • DispatcherServlet t是FrontController類,它接收Spring Web mvc appliaction的所有傳入HTTP客戶端請求。

  • 的DispatcherServlet負責初始化和Spring Web MVC框架,我們的應用程序,並作爲就像任何其他的Servlet子類的HttpServlet來實現的servlet。

  • 的DispatcherServlet也需要我們像任何其他的Servlet即Web應用程序部署描述符(web.xml)網絡的應用

我們可以設置初始化參數來改變行爲進行配置DispatcherServlet相對於定位Spring Beans XML配置文件和初始化應用程序上下文。

  • 下面的圖像描述的一切的DispatcherServlet enter image description here
10

我知道的已經解決了這個問題被標記,但我想添加一個新的圖像詳細解釋這個模式(來源:春天在行動4):

enter image description here

說明

當請求離開瀏覽器(1)時,它攜帶有關用戶請求的信息。至少,請求將攜帶請求的URL。但它也可能帶有其他數據,例如用戶在表單中提交的信息。

請求旅行的第一站是Spring的DispatcherServlet。像大多數基於Java的Web框架一樣,Spring MVC通過一個前端控制器servlet來請求請求。前端控制器是一種常見的Web應用程序模式,其中單個servlet將請求的責任委託給應用程序的其他組件,以執行實際處理。在Spring MVC的情況下,DispatcherServlet是前端控制器。 DispatcherServlet的工作是將請求發送到Spring MVC控制器。控制器是處理請求的Spring組件。但是典型的應用程序可能有多個控制器,而且DispatcherServlet需要一些幫助來決定將請求發送到哪個控制器。因此,DispatcherServlet會查詢一個或多個處理程序映射(2)以確定請求的下一站將在哪裏。處理程序映射在做出決定時特別注意請求所攜帶的URL。 一旦選擇了合適的控制器,DispatcherServlet將其請求以其快捷方式發送到選定的控制器(3)。在控制器上,請求會丟棄其有效負載(用戶提交的信息),並耐心等待控制器處理該信息。 (實際上,設計良好的控制器本身幾乎不進行處理,而是將業務邏輯的責任委派給一個或多個服務對象。) 控制器執行的邏輯通常會導致需要傳回的一些信息給用戶並顯示在瀏覽器中。這些信息被稱爲模型。但是將原始信息發回給用戶是不夠的 - 它需要以用戶友好的格式(通常是HTML)進行格式化。爲此,需要將信息提供給視圖,通常是JavaServer Page(JSP)。 控制器所做的最後一件事情是打包模型數據並確定應呈現輸出的視圖的名稱。然後,它將請求連同模型和視圖名稱一起發送回DispatcherServlet (4)。 爲了使控制器不會耦合到特定的視圖,傳回給DispatcherServlet的視圖名稱不會直接標識特定的JSP。它甚至不一定表明該視圖是一個JSP。相反,它只攜帶一個邏輯名稱,用於查找將生成結果的實際視圖。 DispatcherServlet諮詢解析器(5)將邏輯視圖名稱映射到特定的視圖實現,該實現可能是或不是JSP。 現在DispatcherServlet知道哪個視圖將呈現結果,請求的工作即將結束。它的最後一站是在執行(6),通常是一個JSP,它提供模型數據。請求的工作終於完成了。該視圖將使用模型數據來呈現將由(不太努力)響應對象(7)帶回到客戶端的輸出。

相關問題