環(huán)境:SpringBoot3.0.5
RFC 3986【https://datatracker.ietf.org/doc/html/rfc3986#section-3.3】討論了路徑段中的name-value對。在Spring MVC中,我們將它們稱為“矩陣變量”,但它們也可以稱為URI路徑參數(shù)。
矩陣變量可以出現(xiàn)在任何路徑段中,每個變量用分號分隔,多個值用逗號分隔(例如/cars;color=red,green;year=2012)。還可以通過重復(fù)的變量名指定多個值(例如,color=red;color=green;color=blue)。
如果期望URL包含矩陣變量,則控制器方法的請求映射必須使用URI變量來屏蔽變量內(nèi)容,并確保請求可以成功匹配,而不依賴于矩陣變量的順序和存在。下面的例子使用了一個矩陣變量:
// GET /pets/42;q=11;r=22@GetMapping("/pets/{petId}")public void findPet(@PathVariable String petId, @MatrixVariable int q) { // petId == 42 // q == 11}
@MatrixVariable應(yīng)用場景
/images/pic1.png;colors=rgb;resolution=high
@GetMapping("/m1/{id}")public Object matrix1(@PathVariable("id") Long id, @MatrixVariable Integer q, @MatrixVariable String p) { return String.format("input, id: %d, q: %d, p: %s", id, q, p) ;}
請求
圖片
多個矩陣變量,在不同的路徑變量中定義
@GetMapping("/m2/{cateId}/a2/{artId}")public Object matrix2( @PathVariable("cateId") Long cateId, @MatrixVariable(pathVar = "cateId", name = "q") Integer q1, @PathVariable("artId") Long artId, @MatrixVariable(pathVar = "artId", name = "q") Integer q2) { return String.format("input, cateId: %d, q: %d, artId: %d, q: %s%n", cateId, q1, artId, q2) ;}
請求
圖片
使用Map接收矩陣值
@GetMapping("/m3/{cateId}/a2/{artId}")public Object matrix3( @PathVariable("cateId") Long cateId, @MatrixVariable MultiValueMap<String, String> cateMap, @PathVariable("artId") Long artId, @MatrixVariable(pathVar = "artId") MultiValueMap<String, String> artMap) { return Map.of("cate", cateMap, "art", artMap) ;}
請求
圖片
注意:這里的a=1,2有多個值可以使用','分割。
當(dāng)變量路徑之后沒有添加矩陣參數(shù)時,會報錯。
圖片
我們可以通過配置,指定非必須活著設(shè)定默認(rèn)值。
@GetMapping("/m2/{cateId}/a2/{artId}") public Object matrix2( ..., // 設(shè)置默認(rèn)值 @MatrixVariable(pathVar = "artId", name = "q", required = false, defaultValue = "999") Integer q2) { return String.format("input, cateId: %d, q: %d, artId: %d, q: %s%n", cateId, q1, artId, q2) ; }
這里以上面的 案例2 講解。
public abstract class AbstractHandlerMethodMapping { protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception { HandlerMethod handlerMethod = lookupHandlerMethod(lookupPath, request); } protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) { handleMatch(bestMatch.mapping, lookupPath, request); }}
beastMatch.mapping
圖片
lookupPath
圖片
public abstract class RequestMappingInfoHandlerMapping { protected void handleMatch(RequestMappingInfo info, String lookupPath, HttpServletRequest request) { extractMatchDetails(pprc, lookupPath, request); } private void extractMatchDetails(...) { // 將矩陣編碼存入到request對象中 request.setAttribute(MATRIX_VARIABLES_ATTRIBUTE, result.getMatrixVariables()); }}
3.2 解析@MatrixVariable注解的參數(shù)
public class MatrixVariableMethodArgumentResolver { protected Object resolveName(...) throws Exception { // 從request中取出上一步存入的map集合 Map<String, MultiValueMap<String, String>> pathParameters = (Map<String, MultiValueMap<String, String>>) request.getAttribute(HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST); MatrixVariable ann = parameter.getParameterAnnotation(MatrixVariable.class); // 獲取注解配置的pathVar值 String pathVar = ann.pathVar(); if (!pathVar.equals(ValueConstants.DEFAULT_NONE)) { if (pathParameters.containsKey(pathVar)) { // 取出值 paramValues = pathParameters.get(pathVar).get(name); } } // 返回數(shù)據(jù) return paramValues.get(0); }}
以上本篇文章的全部內(nèi)容,希望對你有所幫助。
完畢!!!
本文鏈接:http://www.www897cc.com/showinfo-26-75322-0.html是否還記得SpringMVC中的@MatrixVariable注解?
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com