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

Spring?MVC啟動(dòng)之HandlerMapping作用及實(shí)現(xiàn)詳解

 更新時(shí)間:2023年03月30日 08:48:28   作者:這堆干貨有點(diǎn)猛  
這篇文章主要為大家介紹了Spring?MVC啟動(dòng)之HandlerMapping作用及實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

 在上一篇文章中,我們介紹了 Spring MVC 的啟動(dòng)流程,接下來我們將發(fā)分多個(gè)篇章詳細(xì)介紹流程中的重點(diǎn)步驟

        今天我們從 HandlerMapping 開始分析,HandlerMapping 是框架中的一個(gè)非常重要的組件。它的作用是將URL請求映射到合適的處理程序(Handler)上,這樣就能夠?qū)崿F(xiàn)控制器與頁面之間的交互。在 Spring MVC 中,有多種不同的 HandlerMapping 實(shí)現(xiàn),本文將對這些實(shí)現(xiàn)的作用和源碼原理進(jìn)行詳細(xì)介紹。

作用

在 Spring MVC 框架中,HandlerMapping 是一個(gè)非常重要的組件,它的作用是將URL請求映射到相應(yīng)的處理程序上。具體來說,HandlerMapping 會(huì)根據(jù)URL請求的路徑、請求參數(shù)等信息,確定需要執(zhí)行哪個(gè)處理程序,并將該處理程序返回給 DispatcherServlet。然后 DispatcherServlet 再將請求分配給相應(yīng)的處理程序,處理程序處理完請求后,將結(jié)果返回給 DispatcherServlet,DispatcherServlet 再將結(jié)果返回給客戶端。

HandlerMapping的實(shí)現(xiàn)

        Spring MVC 框架中有多種不同的 HandlerMapping 實(shí)現(xiàn),每種實(shí)現(xiàn)都有不同的作用和使用場景。下面將逐一介紹這些實(shí)現(xiàn)。

BeanNameUrlHandlerMapping

        BeanNameUrlHandlerMapping 是 Spring MVC 框架中最簡單的 HandlerMapping 實(shí)現(xiàn),它的作用是將 URL 請求的路徑映射到 Bean 的名稱上。具體來說,當(dāng)請求的路徑與一個(gè) Bean 的名稱匹配時(shí),BeanNameUrlHandlerMapping 會(huì)將該請求映射到對應(yīng)的 Bean 上。

例如:

假設(shè)有一個(gè)名為 "/hello" 的請求

我們可以在 Spring 配置文件中定義一個(gè)名為 "helloController" 的 Bean

然后使用 BeanNameUrlHandlerMapping 將 "/hello" 請求映射到該 Bean 上

這樣,當(dāng)客戶端發(fā)送 "/hello" 請求時(shí),DispatcherServlet 就會(huì)將該請求分配給 "helloController" 處理。

BeanNameUrlHandlerMapping 的源碼比較簡單,它的核心代碼如下所示:

public class BeanNameUrlHandlerMapping extends AbstractUrlHandlerMapping {
    protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
        String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
        return obtainHandler(lookupPath, request);
    }
}

        從代碼中可以看出,BeanNameUrlHandlerMapping 實(shí)現(xiàn)了 AbstractUrlHandlerMapping 接口,并重寫了其中的 getHandlerInternal 方法。該方法的作用是根據(jù)請求的 URL 路徑查找相應(yīng)的處理程序

SimpleUrlHandlerMapping

SimpleUrlHandlerMapping 是 Spring MVC 框架中另一種常用的 HandlerMapping 實(shí)現(xiàn),它的作用是將 URL 請求的路徑映射到處理程序上。與 BeanNameUrlHandlerMapping 不同的是,SimpleUrlHandlerMapping 可以將一個(gè)URL請求映射到多個(gè)處理程序上

例如:

假設(shè)有兩個(gè)請求 "/hello" 和 "/world"

我們可以使用 SimpleUrlHandlerMapping 將這兩個(gè)請求分別映射到不同的處理程序上。具體來說,我們可以在 Spring 配置文件中定義多個(gè) Bean,并分別為它們設(shè)置不同的URL路徑。

然后使用 SimpleUrlHandlerMapping 將這些URL路徑與相應(yīng)的處理程序進(jìn)行映射。

這樣,當(dāng)客戶端發(fā)送一個(gè)請求時(shí),SimpleUrlHandlerMapping 就會(huì)根據(jù)請求的URL路徑查找相應(yīng)的處理程序,并將請求分配給該處理程序處理。

SimpleUrlHandlerMapping 的源碼也比較簡單,它的核心代碼如下所示:

public class SimpleUrlHandlerMapping extends AbstractDetectingUrlHandlerMapping {
    protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
        String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
        Object handler = lookupHandler(lookupPath, request);
        if (handler == null) {
            handler = getDefaultHandler();
        }
        return handler;
    }
}

        從代碼中可以看出,SimpleUrlHandlerMapping 同樣實(shí)現(xiàn)了 AbstractUrlHandlerMapping 接口(在 AbstractDetectingUrlHandlerMapping 中繼承),并重寫了其中的 getHandlerInternal 方法。該方法的作用是根據(jù)請求的URL路徑查找相應(yīng)的處理程序。

ControllerClassNameHandlerMapping

        ControllerClassNameHandlerMapping 是Spring MVC 框架中一種比較特殊的 HandlerMapping 實(shí)現(xiàn),它的作用是將URL請求的路徑映射到 Controller 類名上。具體來說,ControllerClassNameHandlerMapping 會(huì)根據(jù)請求的URL路徑查找對應(yīng)的 Controller 類名,并將該類返回給 DispatcherServlet,然后 DispatcherServlet 再將請求分配給該 Controller 類處理。

例如:

假設(shè)有一個(gè)名為 "/hello" 的請求

我們可以定義一個(gè)名為 HelloController的Controller 類

使用 ControllerClassNameHandlerMapping 將 "/hello" 請求映射到該類上。

這樣,當(dāng)客戶端發(fā)送 "/hello" 請求時(shí),ControllerClassNameHandlerMapping 就會(huì)將該請求映射到 HelloController 處理。

ControllerClassNameHandlerMapping 的源碼也比較簡單,它的核心代碼如下所示:

public class ControllerClassNameHandlerMapping extends AbstractControllerUrlHandlerMapping {
    protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
        String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
        String controllerClassName = getClassNameForUrlPath(lookupPath);
        return obtainApplicationContext().getBean(controllerClassName);
    }
}

        從代碼中可以看出,ControllerClassNameHandlerMapping 同樣實(shí)現(xiàn)了 AbstractUrlHandlerMapping 接口,并重寫了其中的 getHandlerInternal 方法。該方法的作用是根據(jù)請求的URL路徑查找相應(yīng)的 Controller 類名,并將該類返回給 DispatcherServlet。

DefaultAnnotationHandlerMapping

        DefaultAnnotationHandlerMapping 是Spring MVC 框架中另一種比較常用的 HandlerMapping實(shí) 現(xiàn),它的作用是將 URL 請求的路徑映射到標(biāo)注了 @RequestMapping 注解的方法上。

        具體來說,DefaultAnnotationHandlerMapping 會(huì)掃描應(yīng)用程序中所有標(biāo)注了 @RequestMapping 注解的方法,并將這些方法與相應(yīng)的URL路徑進(jìn)行映射。

        然后當(dāng)客戶端發(fā)送一個(gè)請求時(shí),DefaultAnnotationHandlerMapping 就會(huì)根據(jù)請求的URL路徑查找相應(yīng)的處理程序,并將該處理程序返回給 DispatcherServlet,然后 DispatcherServlet 再將請求分配給該處理程序處理。

例如:

假設(shè)有一個(gè)名為 "/hello" 的請求

我們可以在 Controller 類的某個(gè)方法上標(biāo)注 @RequestMapping 注解

將該方法與 "/hello" 請求進(jìn)行映射。

這樣,當(dāng)客戶端發(fā)送 "/hello" 請求時(shí),DefaultAnnotationHandlerMapping 就會(huì)將該請求映射到該方法上,然后將該方法返回給 DispatcherServlet 處理。

DefaultAnnotationHandlerMapping 的源碼比較復(fù)雜,因?yàn)樗枰獟呙钁?yīng)用程序中所有標(biāo)注了 @RequestMapping 注解的方法。其核心代碼如下所示:

public class DefaultAnnotationHandlerMapping extends AbstractDetectingUrlHandlerMapping implements BeanFactoryAware, InitializingBean {
    private final List<RequestMappingInfoHandlerMapping> handlerMappings = new ArrayList<>();
    protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
        for (RequestMappingInfoHandlerMapping hm : this.handlerMappings) {
            HandlerExecutionChain handler = hm.getHandler(request);
            if (handler != null) {
                return handler;
            }
        }
        return null;
    }
    public void afterPropertiesSet() throws Exception {
        initHandlerMethods();
    }
    protected void initHandlerMethods() {
        detectHandlerMethods();
        if (logger.isInfoEnabled()) {
            logger.info("Mapped " + this.handlerMethods.size() + " request handler methods");
        }
    }
    protected void detectHandlerMethods() {
        ...
    }
}

        從代碼中可以看出,DefaultAnnotationHandlerMapping 同樣實(shí)現(xiàn)了 AbstractUrlHandlerMapping 接口,并重寫了其中的 getHandlerInternal 方法。該方法的作用是根據(jù)請求的 URL 路徑查找相應(yīng)的處理程序。

        與其他 HandlerMapping 不同的是,DefaultAnnotationHandlerMapping 還實(shí)現(xiàn)了 BeanFactoryAware和InitializingBean 接口,以便在初始化時(shí)掃描應(yīng)用程序中所有標(biāo)注了 @RequestMapping 注解的方法。

        具體來說,它會(huì)調(diào)用 detectHandlerMethods 方法,對應(yīng)用程序中所有標(biāo)注了 @RequestMapping 注解的方法進(jìn)行掃描,并將這些方法與相應(yīng)的URL路徑進(jìn)行映射。

總結(jié)

        在 Spring MVC 框架中,HandlerMapping 用于將URL請求的路徑映射到相應(yīng)的處理程序上。框架中提供了多種不同的 HandlerMapping 實(shí)現(xiàn),包括 BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping、ControllerClassNameHandlerMapping 和 DefaultAnnotationHandlerMapping 等。不同的HandlerMapping 實(shí)現(xiàn)方式適用于不同的應(yīng)用場景。

  • BeanNameUrlHandlerMapping 是最簡單的HandlerMapping實(shí)現(xiàn),它將 URL 請求的路徑直接映射到 Bean 的名稱上。
  • SimpleUrlHandlerMapping 則將 URL 請求的路徑與相應(yīng)的處理程序進(jìn)行映射。
  • ControllerClassNameHandlerMapping 將 URL 請求的路徑映射到 Controller 類名上。
  • DefaultAnnotationHandlerMapping 則將 URL 請求的路徑映射到標(biāo)注了 @RequestMapping 注解的方法上。

無論是哪種 HandlerMapping 實(shí)現(xiàn)方式,它們都遵循相同的流程來處理請求。具體來說,它們的流程如下:

客戶端發(fā)送請求到DispatcherServlet。

  • DispatcherServlet根據(jù)請求的URL路徑選擇相應(yīng)的HandlerMapping。
  • HandlerMapping將請求的URL路徑與相應(yīng)的處理程序進(jìn)行映射。
  • HandlerMapping返回相應(yīng)的處理程序。
  • DispatcherServlet將請求交給相應(yīng)的處理程序進(jìn)行處理。
  • 處理程序進(jìn)行業(yè)務(wù)邏輯的處理,并返回相應(yīng)的結(jié)果。
  • DispatcherServlet將處理程序的結(jié)果進(jìn)行封裝,并返回給客戶端。

以上就是Spring MVC啟動(dòng)之HandlerMapping作用及實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC啟動(dòng)HandlerMapping的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • eclipse 如何創(chuàng)建 user library 方法詳解

    eclipse 如何創(chuàng)建 user library 方法詳解

    這篇文章主要介紹了eclipse 如何創(chuàng)建 user library 方法詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java實(shí)現(xiàn)stream的三個(gè)常用方式(toMap,groupingBy,findFirst)

    Java實(shí)現(xiàn)stream的三個(gè)常用方式(toMap,groupingBy,findFirst)

    本文主要介紹了Java實(shí)現(xiàn)stream的三個(gè)常用方式,主要包括toMap,groupingBy,findFirst,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Maven倉庫的具體使用(本地倉庫+遠(yuǎn)程倉庫)

    Maven倉庫的具體使用(本地倉庫+遠(yuǎn)程倉庫)

    Maven 在某個(gè)統(tǒng)一的位置存儲(chǔ)所有項(xiàng)目的構(gòu)件,這個(gè)統(tǒng)一的位置,我們就稱之為倉庫,本文主要介紹了Maven倉庫的具體使用(本地倉庫+遠(yuǎn)程倉庫),感興趣的可以了解一下
    2023-11-11
  • SpringBoot統(tǒng)一api返回風(fēng)格的實(shí)現(xiàn)

    SpringBoot統(tǒng)一api返回風(fēng)格的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot統(tǒng)一api返回風(fēng)格的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • springboot3如何接入nacos

    springboot3如何接入nacos

    這篇文章主要介紹了springboot3接入nacos的配置方法,經(jīng)過很長時(shí)間的折騰終于搞定,下面把步驟操作過程分享給大家,需要的朋友可以參考下
    2024-03-03
  • JAVA虛擬機(jī)中 -D, -X, -XX ,-server參數(shù)使用

    JAVA虛擬機(jī)中 -D, -X, -XX ,-server參數(shù)使用

    本文主要介紹了JAVA虛擬機(jī)中 -D, -X, -XX ,-server參數(shù)使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • java實(shí)現(xiàn)工資管理簡單程序

    java實(shí)現(xiàn)工資管理簡單程序

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)工資管理簡單程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 基于Spring boot @Value 注解注入屬性值的操作方法

    基于Spring boot @Value 注解注入屬性值的操作方法

    這篇文章主要介紹了結(jié)合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 使用Jenkins自動(dòng)化構(gòu)建工具進(jìn)行敏捷開發(fā)

    使用Jenkins自動(dòng)化構(gòu)建工具進(jìn)行敏捷開發(fā)

    這篇文章主要為大家介紹了使用Jenkins自動(dòng)化構(gòu)建工具進(jìn)行敏捷開發(fā),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Spring Data Jpa 復(fù)合主鍵的實(shí)現(xiàn)

    Spring Data Jpa 復(fù)合主鍵的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Data Jpa 復(fù)合主鍵的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評論

招远市| 韩城市| 成武县| 宣化县| 安平县| 河津市| 健康| 前郭尔| 崇仁县| 龙江县| 山东| 贵港市| 聂拉木县| 安陆市| 合江县| 奉新县| 福海县| 章丘市| 蒲江县| 保德县| 郎溪县| 凌源市| 宁津县| 广宗县| 内乡县| 科尔| 乌拉特中旗| 阳城县| 新巴尔虎左旗| 工布江达县| 乐亭县| 博客| 滦南县| 吉林省| 青岛市| 芜湖县| 潜山县| 曲沃县| 玉田县| 额敏县| 荥经县|