Java?Spring?Boot請求方式與請求映射過程分析
請求方式
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
方法入手,請求首先被該方法攔截
接著創(chuàng)建OrderedHiddenHttpMethodFilter
對象,其又繼承HiddenHttpMethodFilter
HiddenHttpMethodFilter
中的doFilterInternal
核心方法進行了相關攔截操作,要求是Post請求并且請求正常,然后獲取請求參數(shù)_method
request.getParameter(this.methodParam)
從請求中獲取_method
參數(shù)進行判斷攔截,故可修改默認_method
,自定義隱藏參數(shù)。
@Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter() { HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter(); methodFilter.setMethodParam("_mymethod"); return methodFilter; }
請求映射過程分析
首先一個請求肯定會經(jīng)過HttpServlet
類的doGet()
或doPost()
等方法,當然不一定會執(zhí)行,但其子類肯定會有對其的具體實現(xiàn),其實現(xiàn)類如下:
推測+大概看源碼得出Spring Boot的一個請求會經(jīng)過FrameworkServlet
類的doGet()
方法
processRequest
方法又調(diào)用了doService方法
doService方法是一個接口,FrameworkServlet
并沒有具體實現(xiàn)
不過DispatcherServlet
對其經(jīng)行了具體實現(xiàn),doService方法中又調(diào)用doDispatch
核心請求分發(fā)方法
doDispatch方法中又尋找當前請求使用哪個Handler(處理器映射器)
Spring Boot默認已配置有如下5種處理器映射器。這里會挨個嘗試所有的HandlerMapping看是否有匹配的請求
在Spring Boot啟動時,相關處理器映射器已經(jīng)將請求關系進行了綁定,保存了所有@RequestMapping 和handler的映射規(guī)則
如下:某Controller層的/index
請求方法就與RequestMappingHandlerMapping
進行了關聯(lián)綁定
接著再執(zhí)行mapping.getHandler(request)
執(zhí)行this.getHandlerInternal(request)
,來到AbstractHandlerMethodMapping
類重寫的方法
執(zhí)行 super.getHandlerInternal(request);
得到當前請求Path
執(zhí)行this.lookupHandlerMethod(lookupPath, request);
進行判斷當前請求的是具體那個方法,即請求對應的handler,找到后并返回。
到此,Spring Boot的請求映射過程解析完畢。
最終,請求映射過程中涉及的類如下:
到此這篇關于Java Spring Boot請求方式與請求映射過程分析的文章就介紹到這了,更多相關Spring Boot請求映射內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot中實現(xiàn)訂單30分鐘自動取消的三種方案分享
在電商和其他涉及到在線支付的應用中,通常需要實現(xiàn)一個功能:如果用戶在生成訂單后的一定時間內(nèi)未完成支付,系統(tǒng)將自動取消該訂單,本文將詳細介紹基于Spring Boot框架實現(xiàn)訂單30分鐘內(nèi)未支付自動取消的幾種方案,并提供實例代碼,需要的朋友可以參考下2023-10-10springMVC如何將controller中數(shù)據(jù)傳遞到jsp頁面
這篇文章主要介紹了springMVC如何將controller中數(shù)據(jù)傳遞到jsp頁面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07java中Executor,ExecutorService,ThreadPoolExecutor詳解
這篇文章主要介紹了java中Executor,ExecutorService,ThreadPoolExecutor詳解的相關資料,需要的朋友可以參考下2017-02-02