SpringBoot中请求映射的原理
学习资源
https://www.yuque.com/atguigu/springboot/vgzmgh
https://www.bilibili.com/video/BV19K4y1L7MT?p=28
本图是很久以前学习SpringMVC时的,本次学习拿出来对照收获颇多。
带着问题学习:我们写的接口,是如何被处理的。
在SpringBoot中,所有的请求都是会来到DispatcherServlet中,而这也就是SpringMVC中的东西。
从此图可以看出继承树,最终是来到HttpServlet的,也就是说必然会有doGetPost方法。而HttpServlet并没有,于是顺着关系找下去。
在FrameworkServlet中,我们发现了重写的方法:
而两个方法都是调用processRequest的,进入进去:
除了各种初始化过程,最终做的是调用doService方法。而FrameworkServlet中doService是抽象的,来到DispatcherServlet中找到此方法:
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
// 找到当前请求使用哪个Handler(Controller的方法)处理
mappedHandler = getHandler(processedRequest);
//HandlerMapping:处理器映射。/xxx->>xxxx
略过一些与本次学习无关的,直接看倒数两行,将会通过getHandler方法,找到合适的Handler(Controller的方法)处理(流程2、3):
而handlerMapping中会有五个值:
RequestMappingHandlerMapping:保存了所有@RequestMapping 和handler的映射规则:
顺便讲了欢迎页的原理:
• 请求进来,挨个尝试所有的HandlerMapping看是否有请求信息。
• 如果有就找到这个请求对应的handler
• 如果没有就是下一个 HandlerMapping
如果你啥也没传,也就是"/",那么在RequestMappingHandlerMapping中将不会找到合适的,然后他就会循环到下一个控制器:WelcomePageHandlerMapping:
而这个控制器就是专门处理"/"的,于是根据处理,转发到index.html中。
(SpringBoot自动配置欢迎页的 WelcomePageHandlerMapping 。访问 /能访问到index.html;)
而不管是哪个控制器,找到后都会对应的操作逻辑,也就是流程5后面的事情了。