當我們每次傳送請求時,系統是如何找到對應的方法來處理請求的呢?為了解決這個問題,我們檢視springmvc的底層源**
環境:springboot 2.4.2
springboot底層還是使用的springmvc,所以請求過來時,都會到達dispatcherservlet
,而dispatcherservlet
繼承於frameworkservlet
,frameworkservlet
繼承於httpservletbean
,httpservletbean
繼承於httpservlet
,所以本質上dispatcherservlet
是乙個servlet。那麼,在這些類中就要實現doget()
或者dopost()
方法。我們看到,在httpservletbean
這個類中並沒有實現doget後者dopost方法,那麼我們檢視frameworkservlet
類**
可以看到四個方法都覆蓋了httpservlet
中對應的方法,且實現都是processrequest()
方法
在這個方法中,關鍵是呼叫了doservice()
方法,我們檢視這個方法
發現這是乙個抽象方法,需要其子類去實現。所以,我們檢視frameworkservlet
的子類dispatcherservlet
中的doservice()
方法。在這個方法中,我們省略其餘**,最關鍵的部分為
關鍵是呼叫了dodispatch()
方法,所以,對於每個請求進來,都會呼叫org.springframework.web.servlet.dispatcherservlet
的dodispatch()
這個方法來處理請求
在dodispatch方法處加上斷點,開啟debug
傳送乙個原生的get請求,在idea中可以看到傳送請求的路徑為/test
也就是mycontroller中的test1方法。所以gethandler()
方法就是找到請求對應處理方法的關鍵,
還可以找到對應的跳轉,會**到index頁面,也就是首頁
所以這就是歡迎頁的處理器對映
同時,已經獲取到了相應的handler,也就是對應的controller處理方法
match secondbestmatch = matches.get(1); // 獲得第二最佳匹配
if (comparator.compare(bestmatch, secondbestmatch) == 0)
} request.setattribute(best_matching_handler_attribute, bestmatch.handlermethod);
return bestmatch.handlermethod;
}else
} if (match != null) }}
SpringMVC請求對映handler原始碼解讀
請求對映原始碼 首先看一張請求完整流轉圖 這裡感謝上這位大神的圖,部落格位址我忘記了 請求將首先執行frameworkservlet下的service方法根據request請求的method找到對應的do 方法。而這些do 其都會進入核心方法,以doget為例。processrequest 方法中重...
SpringBoot 請求對映原理分析
我們在進行web開發中,每次發請求是如何找到哪個方法去處理這個請求的。springboot中,每乙個請求都會來到dispatcherservlet,底層還是使用springmvc,dispatcherservlet是處理所有請求的開始。dispatcherservlet繼承了frameworkser...
SpringMVC對映和請求引數亂碼配置
1 標準url對映 controller類 package com.controller import com.model.dao.user import org.springframework.stereotype.controller import org.springframework.ui....