springboot 請(qǐng)求映射原理

SpringBoot 請(qǐng)求映射原理

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

眾所周知 springboot 默認(rèn)是 tomcat 容器 (SERVLET web類型)。我們要分析一個(gè)請(qǐng)求過(guò)來(lái)所經(jīng)歷的過(guò)程,自然要從前端總控制器(DispatchServlet)開始說(shuō)起。按照 Servlet 規(guī)范,所有請(qǐng)求都會(huì)被tomcat容器交到 dispatchServlet 的 doService 方法中去處理。跟到這個(gè)方法中去,我們發(fā)現(xiàn)其中設(shè)置了變量進(jìn) request 對(duì)象,然后執(zhí)行了 doDispatch 方法,這個(gè)方法才是真正實(shí)現(xiàn)請(qǐng)求處理的核心。

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 {
                    //檢測(cè)是不是文件上傳
                    processedRequest = this.checkMultipart(request); 
                    //如果是文件上傳,置標(biāo)志位
                    multipartRequestParsed = processedRequest != request;
                    
                    
                    //使用getHandler 來(lái)進(jìn)行匹配  //本節(jié)重要
                    /*
                    在這里debug可以找到對(duì)應(yīng)的 關(guān)系
                    RequestHandlerMapping   
                        -> mappingregistry
                            ->registry
                                ->RequestMappingInfo  這個(gè)里面對(duì)應(yīng)的 關(guān)系  例如"POST/ user"  方法
                    */
                    mappedHandler = this.getHandler(processedRequest);   //此處就具體找到了對(duì)應(yīng)的 那個(gè)controller和那個(gè)方法
                    ....
             
    }

    @Nullable
    protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
        
        // 通過(guò)容器找到所有的handlerMapping
            /*
            RequestMappingHandlerMapping  //這里就是我們需要分析的HandlerMapping
            SimpleUrl
            BeanName
            ...
            WelecomPageHandler //這里就是處理 歡迎頁(yè)的 handlerMapping
            */
        if (this.handlerMappings != null) {
            Iterator var2 = this.handlerMappings.iterator();
            while(var2.hasNext()) {
                HandlerMapping mapping = (HandlerMapping)var2.next();
                //此處進(jìn)行匹配  將匹配的就是(Controller的具體方法)
                HandlerExecutionChain handler = mapping.getHandler(request);
                if (handler != null) {
                    return handler;  //封裝為handler 返回
                }
            }
        }
        return null;
    }

到此,已經(jīng)可以找到 具體的請(qǐng)求映射了
下面分析 參數(shù)的封裝原理
springboot 參數(shù)封裝原理 - 簡(jiǎn)書 (jianshu.com)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容