最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spingmvc中的HandlerMapping剖析

 更新時(shí)間:2023年09月09日 10:11:11   作者:沐雨金鱗  
這篇文章主要介紹了Spingmvc中的HandlerMapping剖析,Spingmvc中的HandlerMapping負(fù)責(zé)解析請(qǐng)求URL,對(duì)應(yīng)到Handler進(jìn)行處理,這里的Handler一般為Controller里的一個(gè)方法method,也可以為servlet或者Controller等,需要的朋友可以參考下

HandlerMapping

1、請(qǐng)求首先進(jìn)入DispatcherServlet, 由DispatcherServlet 從HandlerMappings中匹配對(duì)應(yīng)的Handler,此時(shí)只是獲取到了對(duì)應(yīng)的Handler,然后拿著這個(gè)Handler去尋找對(duì)應(yīng)的適配器,即:HandlerAdapter;

2、拿到對(duì)應(yīng)HandlerAdapter時(shí),這時(shí)候開始調(diào)用對(duì)應(yīng)的Handler方法,即執(zhí)行我們的Controller來處理業(yè)務(wù)邏輯了, 執(zhí)行完成之后返回一個(gè)ModeAndView;

3、HandlerAdapter執(zhí)行完之后,返回一個(gè)ModeAndView,把它交給我們的視圖解析器ViewResolver,通過視圖名稱查找出對(duì)應(yīng)的視圖然后返回;

4、最后,渲染視圖 返回渲染后的視圖。

在介紹HandlerMapping、HandlerAdapter之前,先來說一下SpringMVC中定義Handler的方式,本人就是對(duì)這個(gè)知識(shí)點(diǎn)不熟悉,導(dǎo)致對(duì)這兩個(gè)對(duì)象一直不明白。

先說一下最最最最……常用定義Handler的方式,使用@RequestMapping注解,下面這段代碼不用介紹吧:

@Controller
public class IndexController {
    @RequestMapping("/index")
    @ResponseBody
    public String sayHello(){
        System.out.println("hello ...");
        return "hello";
    }
}

那大家有沒有用過下面的兩種方式來聲明一個(gè)Handler呢??

實(shí)現(xiàn)org.springframework.web.servlet.mvc.Controller控制器接口,此接口只有一個(gè)方法handleRequest(),用于請(qǐng)求的處理,返回ModelAndView。 這個(gè)接口從第一版SpringMVC就存在了,所以這個(gè)接口是非常古老的接口~~~也是Spring MVC最早期的實(shí)現(xiàn)Handler的方式

// 關(guān)注一下這個(gè)包
import org.springframework.web.servlet.mvc.Controller;
@Component("/home")
public class HomeController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, 
    				HttpServletResponse response) throws Exception {
        System.out.println("home ...");
        return null;
    }
	// 這地方考慮個(gè)問題:怎么樣實(shí)現(xiàn)類似@ResponseBody的功能呢?
	// 就是想實(shí)現(xiàn)直接向body里寫數(shù)據(jù),而不是返回一個(gè)頁面。
	// 如果想直接在處理器/控制器里使用response向客戶端寫回?cái)?shù)據(jù),
	// 可以通過返回null來告訴	DispatcherServlet我們已經(jīng)寫出響應(yīng)了,
	// 不需要它進(jìn)行視圖解析。像下面這樣
	@Override
    public ModelAndView handleRequest(HttpServletRequest request,
    				 HttpServletResponse response) throws Exception {
        System.out.println("home ...");
        response.getWriter().write("home controller from body");
        return null; // 返回null告訴視圖渲染  直接把body里面的內(nèi)容輸出瀏覽器即可
    }
}

Spingmvc中的HandlerMapping負(fù)責(zé)解析請(qǐng)求URL,對(duì)應(yīng)到Handler進(jìn)行處理(這里的Handler一般為Controller里的一個(gè)方法method,也可以為servlet或者Controller等)

來看一個(gè)http請(qǐng)求的入口DispatcherServlet:

  • DispatcherServlet繼承FrameworkServlet,F(xiàn)rameworkServlet繼承HttpServletBean,HttpServletBean繼承HttpServlet。

可以看出,springmvc的DispatcherServlet是在Servelt的基礎(chǔ)上做了擴(kuò)展處理。

doService方法為servlet處理請(qǐng)求的入口,DispatcherServlet中做了方法覆蓋,doService方法中的doDispatch(request,response)方法,是springmvc處理整個(gè)請(qǐng)求流程的關(guān)鍵。

  • mappedHandler =getHandler(processedRequest);
  • 這行代碼實(shí)現(xiàn)了為請(qǐng)求尋找處理handler,返回的是HandlerExecutionChain;
  • HandlerAdapter ha =getHandlerAdapter(mappedHandler.getHandler());
  • 找到處理handler后,再去找匹配的HandlerAdapter,HandlerAdapter將完成后續(xù)處理。

繼續(xù)看是如何找到請(qǐng)求對(duì)應(yīng)的處理handler的:

  • 可以看出是從類變量this.handlerMappings中循環(huán)獲取,當(dāng)找到與之匹配的HandlerMapping時(shí),返回類型為HandlerExecutionChain的handler。

這里this.handlerMappings中的值是從哪獲取的呢?DispatcherServlet初始化的時(shí)候會(huì)給this.handlerMappings賦值:

  • 從這里可以看出,在servlet初始化的時(shí)候,會(huì)對(duì)springmvc的HandlerMappings、HandlerAdapters等做初始化。
  • 這里三個(gè)步驟,先對(duì)springmvc.xml里配置的HandlerMapping進(jìn)行初始化、實(shí)例化,再對(duì)this.handlerMappings賦值,最后對(duì)this.handlerMappings進(jìn)行排序。
  • 這里的排序就是對(duì)HandlerMapping的order屬性進(jìn)行排序,這樣,order屬性值小的,就可以先對(duì)請(qǐng)求進(jìn)行匹配。
  • 從tomcat啟動(dòng)日志里可以看到HandlerMapping的初始化:

 這里涉及到兩個(gè)HandlerMapping:

  • 第一個(gè)是BeanNameUrlHandlerMapping,初始化時(shí)會(huì)將urlpath做映射存儲(chǔ);
  • 第二個(gè)是RequestMappingHandlerMapping,初始化時(shí)會(huì)將Controller中配置@RequestMapping注解的方法做映射存儲(chǔ)。

HandlerMapping初始化時(shí),會(huì)將映射與handler存儲(chǔ)到map里;處理請(qǐng)求時(shí),從map里取出對(duì)應(yīng)的處理handler。

這就是HandlerMapping在springmvc里的大致處理流程。

到此這篇關(guān)于SpringBoot中的HandlerMapping剖析的文章就介紹到這了,更多相關(guān)SpringBoot的HandlerMapping內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java封裝Redis非阻塞分布式鎖徹底解決表單重復(fù)提交主鍵沖突問題

    Java封裝Redis非阻塞分布式鎖徹底解決表單重復(fù)提交主鍵沖突問題

    本文基于原生RedisTemplate封裝通用非阻塞分布式鎖工具類,實(shí)現(xiàn)鎖邏輯與業(yè)務(wù)邏輯解耦,兼顧易用性與安全性,同時(shí)解決鎖與事務(wù)配合、鎖釋放時(shí)機(jī)、失敗重試等核心坑點(diǎn),感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • SpringBoot讀取yaml文件操作詳解

    SpringBoot讀取yaml文件操作詳解

    YAML 是 “YAML Ain’t Markup Language”(YAML 不是一種標(biāo)記語言)的遞歸縮寫。在開發(fā)的這種語言時(shí),YAML 的意思其實(shí)是:“Yet Another Markup Language”(仍是一種標(biāo)記語言),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 詳解Quartz 與 Spring框架集成的三種方式

    詳解Quartz 與 Spring框架集成的三種方式

    這篇文章主要介紹了詳解Quartz 與 Spring框架集成的三種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • java SpringSecurity使用詳解

    java SpringSecurity使用詳解

    這篇文章主要介紹了java中Spring Security的實(shí)例詳解的相關(guān)資料,spring security是一個(gè)多方面的安全認(rèn)證框架,提供了基于JavaEE規(guī)范的完整的安全認(rèn)證解決方案,需要的朋友可以參考下
    2021-08-08
  • java統(tǒng)計(jì)字符串單詞個(gè)數(shù)的方法解析

    java統(tǒng)計(jì)字符串單詞個(gè)數(shù)的方法解析

    在一些項(xiàng)目中可能需要對(duì)一段字符串中的單詞進(jìn)行統(tǒng)計(jì),本文在這里分享了一個(gè)簡(jiǎn)單的demo,有需要的朋友可以拿去看一下
    2017-01-01
  • 淺談java 重寫equals方法的種種坑

    淺談java 重寫equals方法的種種坑

    這篇文章主要介紹了淺談java 重寫equals方法的種種“坑”,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • java 8如何自定義收集器(collector)詳解

    java 8如何自定義收集器(collector)詳解

    這篇文章主要給大家介紹了關(guān)于java 8如何自定義收集器(collector)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • Spring依賴注入DI之三種依賴注入類型詳解

    Spring依賴注入DI之三種依賴注入類型詳解

    這篇文章主要介紹了Spring依賴注入DI之三種依賴注入類型詳解,通過 @Autowired 注解,字段注入的實(shí)現(xiàn)方式非常簡(jiǎn)單而直接,代碼的可讀性也很強(qiáng),事實(shí)上,字段注入是三種注入方式中最常用、也是最容易使用的一種,需要的朋友可以參考下
    2023-09-09
  • Java 創(chuàng)建動(dòng)態(tài)類和查看方法列表信息的實(shí)例

    Java 創(chuàng)建動(dòng)態(tài)類和查看方法列表信息的實(shí)例

    這篇文章主要介紹了 Java 創(chuàng)建動(dòng)態(tài)類和查看方法列表信息的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java中Date數(shù)據(jù)類型的數(shù)值轉(zhuǎn)換方式

    Java中Date數(shù)據(jù)類型的數(shù)值轉(zhuǎn)換方式

    這篇文章主要介紹了Java中Date數(shù)據(jù)類型的數(shù)值轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論

湟源县| 石嘴山市| 渝北区| 北宁市| 新源县| 六枝特区| 南川市| 莎车县| 宜宾市| 深州市| 石首市| 板桥市| 合肥市| 英德市| 两当县| 张家港市| 澄城县| 石狮市| 奉新县| 达拉特旗| 通渭县| 青铜峡市| 准格尔旗| 唐海县| 乐昌市| 安远县| 福清市| 峨山| 潼关县| 利川市| 青铜峡市| 郁南县| 伊金霍洛旗| 柞水县| 沙河市| 余干县| 荣昌县| 水城县| 福泉市| 白银市| 漳州市|