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注解的方法