不少Java面試官喜歡問這個問題:web
一個Spring MVC的項目文件裏,開發人員沒有開發本身的Servlet,只經過註解@RequestMapping定義了方法home能響應發向 /mvc/test1的請求。面試
使用url http://localhost:9098/MavenSandbox/mvc/test1 測試,能觀察到home方法返回的字符串,這背後的工做原理是什麼?spring
咱們經過本身的研究來回答。在上述代碼第53行設置斷點。再次訪問url http://localhost:9098/MavenSandbox/mvc/test1,斷點觸發。咱們觀察調用棧,發現有一個棧幀DispatcherServlet.doService(HttpServletRequest, HttpServletResponse)。這個Servlet會負責將咱們加了@RequestMapping註解的方法裏return的字符串加到HttpServletResponse裏,這就是爲何咱們在瀏覽器裏能看到return字符串的緣由。數組
咱們看下DispatcherServlet.doService裏的HttpServletResponse裏是否包含了咱們指望的輸出字符串。在調試器裏展開response變量:瀏覽器
response->outputBuffer->bb->buff, 在buff裏能看到這個字符串數組緩衝:mvc
104是H的ASCII碼,101是e的ASCII碼,108是l的ASCII碼,因此證實了response確實包含了開發人員在home方法裏返回的字符串:hello this is a most simple exampleapp
最後,DispatcherServlet從哪裏來的?框架
在Eclipse調試器裏發現,它是Spring框架的標準Servlet:測試
org.springframework.web.servlet.DispatcherServletthis
這個Servlet正是咱們在WEB-INF文件夾的web.xml文件裏的Servlet。
所以給面試官的答案爲:Spring MVC框架仍然須要Servlet,但這個Servlet是由Spring框架提供,無需應用開發人員重複實現。
要獲取更多Jerry的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼: