Spring MVC能響應HTTP請求的原因?

i042416發表於2018-08-29

很多Java面試官喜歡問這個問題:

一個Spring MVC的專案檔案裡,開發人員沒有開發自己的Servlet,只通過註解@RequestMapping定義了方法home能響應發向 /mvc/test1的請求。

Spring MVC能響應HTTP請求的原因?

使用url  http://localhost:9098/MavenSandbox/mvc/test1  測試,能觀察到home方法返回的字串,這背後的工作原理是什麼?

Spring MVC能響應HTTP請求的原因?

我們通過自己的研究來回答。在上述程式碼第53行設定斷點。再次訪問url  http://localhost:9098/MavenSandbox/mvc/test1 ,斷點觸發。我們觀察呼叫棧,發現有一個棧幀DispatcherServlet.doService(HttpServletRequest, HttpServletResponse)。這個Servlet會負責將我們加了@RequestMapping註解的方法裡return的字串加到HttpServletResponse裡,這就是為什麼我們在瀏覽器裡能看到return字串的原因。

Spring MVC能響應HTTP請求的原因?

我們看下DispatcherServlet.doService裡的HttpServletResponse裡是否包含了我們期望的輸出字串。在偵錯程式裡展開response變數:

Spring MVC能響應HTTP請求的原因?

response->outputBuffer->bb->buff, 在buff裡能看到這個字串陣列緩衝:

Spring MVC能響應HTTP請求的原因?

104是H的ASCII碼,101是e的ASCII碼,108是l的ASCII碼,所以證明了response確實包含了開發人員在home方法裡返回的字串:hello this is a most simple example

最後,DispatcherServlet從哪裡來的?

在Eclipse偵錯程式裡發現,它是Spring框架的標準Servlet:

org.springframework.web.servlet.DispatcherServlet

Spring MVC能響應HTTP請求的原因?

這個Servlet正是我們在WEB-INF資料夾的web.xml檔案裡的Servlet。

因此給面試官的答案為:Spring MVC框架仍然需要Servlet,但這個Servlet是由Spring框架提供,無需應用開發人員重複實現。

Spring MVC能響應HTTP請求的原因?

要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:


Spring MVC能響應HTTP請求的原因?

Spring MVC能響應HTTP請求的原因?


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2213090/,如需轉載,請註明出處,否則將追究法律責任。

相關文章