首頁 > 軟體

Java Spring Boot請求方式與請求對映過程分析

2022-06-24 22:02:36

請求方式

Spring Boot支援Rest風格:使用HTTP請求方式的動詞來表示對資源的操作

非Rest風格

以前這樣寫介面:

/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風格

使用Rest風格,則這樣寫介面:

 /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";
    }

表單提交

通過表單方式提交請求,請求型別只能支援Get與Post

若表單提交要使用REST風格,則表單請求方式使用Post,新增隱藏域 _method=put、 _method=delete方式來支援Rest風格

範例如下:

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

SpringBoot組態檔中開啟頁面表單的Rest功能

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

過程分析

首先是從自動設定類WebMvcAutoConfiguration開始,其中的hiddenHttpMethodFilter方法入手,請求首先被該方法攔截

接著建立OrderedHiddenHttpMethodFilter物件,其又繼承HiddenHttpMethodFilter

HiddenHttpMethodFilter中的doFilterInternal核心方法進行了相關攔截操作,要求是Post請求並且請求正常,然後獲取請求引數_method

request.getParameter(this.methodParam)從請求中獲取_method引數進行判斷攔截,故可修改預設_method,自定義隱藏引數。

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

請求對映過程分析

首先一個請求肯定會經過HttpServlet類的doGet()doPost()等方法,當然不一定會執行,但其子類肯定會有對其的具體實現,其實現類如下:

推測+大概看原始碼得出Spring Boot的一個請求會經過FrameworkServlet類的doGet()方法

processRequest方法又呼叫了doService方法

doService方法是一個介面,FrameworkServlet並沒有具體實現

不過DispatcherServlet對其經行了具體實現,doService方法中又呼叫doDispatch核心請求分發方法

doDispatch方法中又尋找當前請求使用哪個Handler(處理器對映器)

Spring Boot預設已設定有如下5種處理器對映器。這裡會挨個嘗試所有的HandlerMapping看是否有匹配的請求

在Spring Boot啟動時,相關處理器對映器已經將請求關係進行了繫結,儲存了所有@RequestMapping 和handler的對映規則

如下:某Controller層的/index請求方法就與RequestMappingHandlerMapping進行了關聯絡結

接著再執行mapping.getHandler(request)

執行this.getHandlerInternal(request),來到AbstractHandlerMethodMapping類重寫的方法

執行 super.getHandlerInternal(request);得到當前請求Path

執行this.lookupHandlerMethod(lookupPath, request);進行判斷當前請求的是具體那個方法,即請求對應的handler,找到後並返回。

到此,Spring Boot的請求對映過程解析完畢。

最終,請求對映過程中涉及的類如下:

到此這篇關於Java Spring Boot請求方式與請求對映過程分析的文章就介紹到這了,更多相關Spring Boot請求對映內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com