SpringBoot中請求映射的原理
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達(dá)
76套java從入門到精通實(shí)戰(zhàn)課程分享

本圖是很久以前學(xué)習(xí)SpringMVC時的,本次學(xué)習(xí)拿出來對照收獲頗多。
帶著問題學(xué)習(xí):我們寫的接口,是如何被處理的。
在SpringBoot中,所有的請求都是會來到DispatcherServlet中,而這也就是SpringMVC中的東西。

從此圖可以看出繼承樹,最終是來到HttpServlet的,也就是說必然會有doGetPost方法。而HttpServlet并沒有,于是順著關(guān)系找下去。
在FrameworkServlet中,我們發(fā)現(xiàn)了重寫的方法:
而兩個方法都是調(diào)用processRequest的,進(jìn)入進(jìn)去:
除了各種初始化過程,最終做的是調(diào)用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);
????//?找到當(dāng)前請求使用哪個Handler(Controller的方法)處理
????mappedHandler?=?getHandler(processedRequest);
????????????????
????????????????//HandlerMapping:處理器映射。/xxx->>xxxx
略過一些與本次學(xué)習(xí)無關(guān)的,直接看倒數(shù)兩行,將會通過getHandler方法,找到合適的Handler(Controller的方法)處理(流程2、3):
而handlerMapping中會有五個值:
RequestMappingHandlerMapping:保存了所有@RequestMapping 和handler的映射規(guī)則:
順便講了歡迎頁的原理:
? 請求進(jìn)來,挨個嘗試所有的HandlerMapping看是否有請求信息。
? 如果有就找到這個請求對應(yīng)的handler
? 如果沒有就是下一個 HandlerMapping
如果你啥也沒傳,也就是"/",那么在RequestMappingHandlerMapping中將不會找到合適的,然后他就會循環(huán)到下一個控制器:WelcomePageHandlerMapping:
而這個控制器就是專門處理"/"的,于是根據(jù)處理,轉(zhuǎn)發(fā)到index.html中。
(SpringBoot自動配置歡迎頁的 WelcomePageHandlerMapping 。訪問 /能訪問到index.html;)
而不管是哪個控制器,找到后都會對應(yīng)的操作邏輯,也就是流程5后面的事情了。
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/weixin_42313246/article/details/112311353
粉絲福利:Java從入門到入土學(xué)習(xí)路線圖
??????

??長按上方微信二維碼?2 秒
感謝點(diǎn)贊支持下哈?
