SpringMVC請求對映原理

2022-07-06 22:36:15 字數 2487 閱讀 7118

當我們每次傳送請求時,系統是如何找到對應的方法來處理請求的呢?為了解決這個問題,我們檢視springmvc的底層源**

環境:springboot 2.4.2

springboot底層還是使用的springmvc,所以請求過來時,都會到達dispatcherservlet,而dispatcherservlet繼承於frameworkservletframeworkservlet繼承於httpservletbeanhttpservletbean繼承於httpservlet,所以本質上dispatcherservlet是乙個servlet。那麼,在這些類中就要實現doget()或者dopost()方法。我們看到,在httpservletbean這個類中並沒有實現doget後者dopost方法,那麼我們檢視frameworkservlet類**

可以看到四個方法都覆蓋了httpservlet中對應的方法,且實現都是processrequest()方法

在這個方法中,關鍵是呼叫了doservice()方法,我們檢視這個方法

發現這是乙個抽象方法,需要其子類去實現。所以,我們檢視frameworkservlet的子類dispatcherservlet中的doservice()方法。在這個方法中,我們省略其餘**,最關鍵的部分為

關鍵是呼叫了dodispatch()方法,所以,對於每個請求進來,都會呼叫org.springframework.web.servlet.dispatcherservletdodispatch()這個方法來處理請求

在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....