18.SpringBoot中请求映射的原理

本图是很久以前学习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后面的事情了。

posted @ 2022-08-07 09:58  随遇而安==  阅读(45)  评论(0)    收藏  举报