Servlet 和 Controller


先上結論:

Controller是spring 的一個bean,由spring的IOC來管理的一個bean

Servlet是一個接口或者接口的實現(常見的是GenericServlet 和 HttpServlet)

 

HttpServlet做的事情:

首先,有一個映射關系servlet-mapping,url的endpoint 對應的具體的servlet, 比如規定'/lalala' 映射到KevinServlet(繼承自HttpServlet,重寫doGet,doPost等方法)

傳送門(https://blog.csdn.net/zj12352123/article/details/80576748),映射規則的定義,如果是老的Spring項目的話是寫在web.xml

 

 

 

那你在瀏覽器地址欄輸入localhost:8088/lalala   , 這個請求就會執行到KevinServlet的doGet方法,經過一系列邏輯,最終將要返回給瀏覽器的數據寫入HttpServletResponse,這樣瀏覽器就能收到結果。

 

而Controller,只是一個bean,方法上可以加上注解GetMapping,PostMapping等,標注映射的url的endpoint

 

 那請求是怎么到達Controller的具體某個方法的呢

Servlet容器(Tomcat等)接收到請求以后,將請求交給DispatcherServlet的service方法來處理,servlet會在doDispatch里面先找到mappedHandler ,然后找到HandlerAdapter

mappedHandler = this.getHandler(processedRequest);
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
調用HandlerAdapter 的handle方法,其實應該是AbstractHandlerMethodAdapter,
然后調用到RequestMappingHandlerAdapter的handleInternal,最終調用到invokeAndHandle,反射調用controller的方法

具體的時序圖
https://blog.csdn.net/caoyuanyenang/article/details/114401414
 
        

找到endpoint對應的bean的方法,並調用。

容器==》DispatcherServlet (service方法) ==》 doDispatcher ==》HandlerAdapter (handle)=》AbstractHandlerMethodAdapter==》RequestMappingHandlerAdapter

 ==》invokeAndHandle==》反射具體的controller方法

 

handlerMappings  代碼中所有的controller的帶MappingRequest注解的方法
HandlerExecutionChain getHandler 根據請求中的endpoint,匹配到controller的帶MappingRequest注解的方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM