springboot 请求映射原理

SpringBoot 请求映射原理

url = localhost:8080/user?username=zhangsan&age=18

众所周知 springboot 默认是 tomcat 容器 (SERVLET web类型)。我们要分析一个请求过来所经历的过程,自然要从前端总控制器(DispatchServlet)开始说起。按照 Servlet 规范,所有请求都会被tomcat容器交到 dispatchServlet 的 doService 方法中去处理。跟到这个方法中去,我们发现其中设置了变量进 request 对象,然后执行了 doDispatch 方法,这个方法才是真正实现请求处理的核心。

DispatchServlet.java
    protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
        this.logRequest(request);
        try {
            this.doDispatch(request, response);
        } finally {
           
        }
 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequest processedRequest = request;
        HandlerExecutionChain mappedHandler = null;
        boolean multipartRequestParsed = false;
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

        try {
            try {
                ModelAndView mv = null;
                Object dispatchException = null;

                try {
                    //检测是不是文件上传
                    processedRequest = this.checkMultipart(request); 
                    //如果是文件上传,置标志位
                    multipartRequestParsed = processedRequest != request;
                    
                    
                    //使用getHandler 来进行匹配  //本节重要
                    /*
                    在这里debug可以找到对应的 关系
                    RequestHandlerMapping   
                        -> mappingregistry
                            ->registry
                                ->RequestMappingInfo  这个里面对应的 关系  例如"POST/ user"  方法
                    */
                    mappedHandler = this.getHandler(processedRequest);   //此处就具体找到了对应的 那个controller和那个方法
                    ....
             
    }

    @Nullable
    protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
        
        // 通过容器找到所有的handlerMapping
            /*
            RequestMappingHandlerMapping  //这里就是我们需要分析的HandlerMapping
            SimpleUrl
            BeanName
            ...
            WelecomPageHandler //这里就是处理 欢迎页的 handlerMapping
            */
        if (this.handlerMappings != null) {
            Iterator var2 = this.handlerMappings.iterator();
            while(var2.hasNext()) {
                HandlerMapping mapping = (HandlerMapping)var2.next();
                //此处进行匹配  将匹配的就是(Controller的具体方法)
                HandlerExecutionChain handler = mapping.getHandler(request);
                if (handler != null) {
                    return handler;  //封装为handler 返回
                }
            }
        }
        return null;
    }

到此,已经可以找到 具体的请求映射了
下面分析 参数的封装原理
springboot 参数封装原理 - (jianshu.com)

你可能感兴趣的:(springboot 请求映射原理)