欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?Spring?Boot請(qǐng)求方式與請(qǐng)求映射過(guò)程分析

 更新時(shí)間:2022年06月24日 14:59:24   作者:??丨Jack_Chen丨????  
這篇文章主要介紹了Java?Spring?Boot請(qǐng)求方式與請(qǐng)求映射過(guò)程分析,Spring?Boot支持Rest風(fēng)格:使用HTTP請(qǐng)求方式的動(dòng)詞來(lái)表示對(duì)資源的操作

請(qǐng)求方式

Spring Boot支持Rest風(fēng)格:使用HTTP請(qǐng)求方式的動(dòng)詞來(lái)表示對(duì)資源的操作

非Rest風(fēng)格

以前這樣寫(xiě)接口:

/getUser   獲取用戶
/deleteUser 刪除用戶
/updateUser  修改用戶
/saveUser 保存用戶
	@RequestMapping(value = "/getUser", method = RequestMethod.GET)
    public String getUser() {
        return "GET";
    }
    @RequestMapping(value = "/deleteUser", method = RequestMethod.POST)
    public String deleteUser() {
        return "POST";
    }
    @RequestMapping(value = "/updateUser", method = RequestMethod.POST)
    public String updateUser() {
        return "POST";
    }
    @RequestMapping(value = "/saveUser", method = RequestMethod.POST)
    public String saveUser() {
        return "POST";
    }

使用Rest風(fēng)格

使用Rest風(fēng)格,則這樣寫(xiě)接口:

 /user    GET-獲取用戶    DELETE-刪除用戶     PUT-修改用戶      POST-保存用戶
    @GetMapping("/user")
    public String getUser() {
        return "GET";
    }
    @PostMapping("/user")
    public String saveUser() {
        return "POST";
    }
    @PutMapping("/user")
    public String putUser() {
        return "PUT";
    }
    @DeleteMapping("/user")
    public String deleteUser() {
        return "DELETE";
    }

表單提交

通過(guò)表單方式提交請(qǐng)求,請(qǐng)求類型只能支持Get與Post

若表單提交要使用REST風(fēng)格,則表單請(qǐng)求方式使用Post,添加隱藏域 _method=put、 _method=delete方式來(lái)支持Rest風(fēng)格

示例如下:

<form action="/user" method="post">
	<input name="_method" type="hidden" value="delete"/>
    <input value="REST提交" type="submit"/>
</form>

SpringBoot配置文件中開(kāi)啟頁(yè)面表單的Rest功能

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

過(guò)程分析

首先是從自動(dòng)配置類WebMvcAutoConfiguration開(kāi)始,其中的hiddenHttpMethodFilter方法入手,請(qǐng)求首先被該方法攔截

接著創(chuàng)建OrderedHiddenHttpMethodFilter對(duì)象,其又繼承HiddenHttpMethodFilter

HiddenHttpMethodFilter中的doFilterInternal核心方法進(jìn)行了相關(guān)攔截操作,要求是Post請(qǐng)求并且請(qǐng)求正常,然后獲取請(qǐng)求參數(shù)_method

request.getParameter(this.methodParam)從請(qǐng)求中獲取_method參數(shù)進(jìn)行判斷攔截,故可修改默認(rèn)_method,自定義隱藏參數(shù)。

   @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
        HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
        methodFilter.setMethodParam("_mymethod");
        return methodFilter;
    }

請(qǐng)求映射過(guò)程分析

首先一個(gè)請(qǐng)求肯定會(huì)經(jīng)過(guò)HttpServlet類的doGet()doPost()等方法,當(dāng)然不一定會(huì)執(zhí)行,但其子類肯定會(huì)有對(duì)其的具體實(shí)現(xiàn),其實(shí)現(xiàn)類如下:

推測(cè)+大概看源碼得出Spring Boot的一個(gè)請(qǐng)求會(huì)經(jīng)過(guò)FrameworkServlet類的doGet()方法

processRequest方法又調(diào)用了doService方法

doService方法是一個(gè)接口,FrameworkServlet并沒(méi)有具體實(shí)現(xiàn)

不過(guò)DispatcherServlet對(duì)其經(jīng)行了具體實(shí)現(xiàn),doService方法中又調(diào)用doDispatch核心請(qǐng)求分發(fā)方法

doDispatch方法中又尋找當(dāng)前請(qǐng)求使用哪個(gè)Handler(處理器映射器)

Spring Boot默認(rèn)已配置有如下5種處理器映射器。這里會(huì)挨個(gè)嘗試所有的HandlerMapping看是否有匹配的請(qǐng)求

在Spring Boot啟動(dòng)時(shí),相關(guān)處理器映射器已經(jīng)將請(qǐng)求關(guān)系進(jìn)行了綁定,保存了所有@RequestMapping 和handler的映射規(guī)則

如下:某Controller層的/index請(qǐng)求方法就與RequestMappingHandlerMapping進(jìn)行了關(guān)聯(lián)綁定

接著再執(zhí)行mapping.getHandler(request)

執(zhí)行this.getHandlerInternal(request),來(lái)到AbstractHandlerMethodMapping類重寫(xiě)的方法

執(zhí)行 super.getHandlerInternal(request);得到當(dāng)前請(qǐng)求Path

執(zhí)行this.lookupHandlerMethod(lookupPath, request);進(jìn)行判斷當(dāng)前請(qǐng)求的是具體那個(gè)方法,即請(qǐng)求對(duì)應(yīng)的handler,找到后并返回。

到此,Spring Boot的請(qǐng)求映射過(guò)程解析完畢。

最終,請(qǐng)求映射過(guò)程中涉及的類如下:

到此這篇關(guān)于Java Spring Boot請(qǐng)求方式與請(qǐng)求映射過(guò)程分析的文章就介紹到這了,更多相關(guān)Spring Boot請(qǐng)求映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot封裝響應(yīng)處理超詳細(xì)講解

    SpringBoot封裝響應(yīng)處理超詳細(xì)講解

    這篇文章主要介紹了SpringBoot封裝響應(yīng)處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12
  • SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的三種方案分享

    SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的三種方案分享

    在電商和其他涉及到在線支付的應(yīng)用中,通常需要實(shí)現(xiàn)一個(gè)功能:如果用戶在生成訂單后的一定時(shí)間內(nèi)未完成支付,系統(tǒng)將自動(dòng)取消該訂單,本文將詳細(xì)介紹基于Spring Boot框架實(shí)現(xiàn)訂單30分鐘內(nèi)未支付自動(dòng)取消的幾種方案,并提供實(shí)例代碼,需要的朋友可以參考下
    2023-10-10
  • java簡(jiǎn)單實(shí)現(xiàn)多線程及線程池實(shí)例詳解

    java簡(jiǎn)單實(shí)現(xiàn)多線程及線程池實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單實(shí)現(xiàn)多線程,及java爬蟲(chóng)使用線程池實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 一文搞懂Java中的反射機(jī)制

    一文搞懂Java中的反射機(jī)制

    Java的反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任何一個(gè)類,都可以知道這個(gè)類的所有屬性和方法,對(duì)于任何一個(gè)對(duì)象,都可以調(diào)用它所有的方法和屬性,修改部分類型信息。本文就來(lái)詳細(xì)講講Java反射機(jī)制的使用
    2022-07-07
  • Javabean和map相互轉(zhuǎn)化方法代碼示例

    Javabean和map相互轉(zhuǎn)化方法代碼示例

    這篇文章主要介紹了Javabean和map相互轉(zhuǎn)化方法示例,介紹了其通用方法代碼,需要的朋友可以參考下。
    2017-09-09
  • Java反應(yīng)式框架Reactor中的Mono和Flux

    Java反應(yīng)式框架Reactor中的Mono和Flux

    這篇文章主要介紹了Java反應(yīng)式框架Reactor中的Mono和Flux,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Java中EnumMap的使用解析

    Java中EnumMap的使用解析

    這篇文章主要介紹了Java中EnumMap的使用解析,EnumMap?是一種特殊的?Map,它要求自身所有的鍵來(lái)自某個(gè)枚舉類型,EnumMap?的內(nèi)部可以作為一個(gè)數(shù)組來(lái)實(shí)現(xiàn),因此它們的性能非常好,你可以放心地用?EnumMap?來(lái)實(shí)現(xiàn)基于枚舉的查詢,需要的朋友可以參考下
    2023-11-11
  • Spring?Boot常用功能Profile詳解

    Spring?Boot常用功能Profile詳解

    SpringBootProfile是一個(gè)很常用的功能,我們可以通過(guò)為開(kāi)發(fā)/測(cè)試/生產(chǎn)環(huán)境配置不同的profile來(lái)實(shí)現(xiàn)配置隔離,那么在SpringBoot項(xiàng)目中是如何實(shí)現(xiàn)profile功能的呢
    2022-07-07
  • springMVC如何將controller中數(shù)據(jù)傳遞到j(luò)sp頁(yè)面

    springMVC如何將controller中數(shù)據(jù)傳遞到j(luò)sp頁(yè)面

    這篇文章主要介紹了springMVC如何將controller中數(shù)據(jù)傳遞到j(luò)sp頁(yè)面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • java中Executor,ExecutorService,ThreadPoolExecutor詳解

    java中Executor,ExecutorService,ThreadPoolExecutor詳解

    這篇文章主要介紹了java中Executor,ExecutorService,ThreadPoolExecutor詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評(píng)論