AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

是否還記得SpringMVC中的@MatrixVariable注解?

來源: 責編: 時間:2024-02-29 14:41:19 196觀看
導讀環境:SpringBoot3.0.51. 簡介RFC 3986【https://datatracker.ietf.org/doc/html/rfc3986#section-3.3】討論了路徑段中的name-value對。在Spring MVC中,我們將它們稱為“矩陣變量”,但它們也可以稱為URI路徑參數。矩陣變

環境:SpringBoot3.0.5N9J28資訊網——每日最新資訊28at.com

1. 簡介

RFC 3986【https://datatracker.ietf.org/doc/html/rfc3986#section-3.3】討論了路徑段中的name-value對。在Spring MVC中,我們將它們稱為“矩陣變量”,但它們也可以稱為URI路徑參數。N9J28資訊網——每日最新資訊28at.com

矩陣變量可以出現在任何路徑段中,每個變量用分號分隔,多個值用逗號分隔(例如/cars;color=red,green;year=2012)。還可以通過重復的變量名指定多個值(例如,color=red;color=green;color=blue)。N9J28資訊網——每日最新資訊28at.com

如果期望URL包含矩陣變量,則控制器方法的請求映射必須使用URI變量來屏蔽變量內容,并確保請求可以成功匹配,而不依賴于矩陣變量的順序和存在。下面的例子使用了一個矩陣變量:N9J28資訊網——每日最新資訊28at.com

// GET /pets/42;q=11;r=22@GetMapping("/pets/{petId}")public void findPet(@PathVariable String petId, @MatrixVariable int q) {  // petId == 42  // q == 11}

@MatrixVariable應用場景N9J28資訊網——每日最新資訊28at.com

  • 主要適用于需要在URI路徑中傳遞多個與路徑段相關的參數,并且希望保持URI清晰、語義化的情況下。
  • 一個資源需要通過多維度資源定位時,一個URI可能需要同時標識多個維度的信息。比如在一個圖片處理服務中,可能會通過顏色模式、分辨率等參數來定位特定版本的圖片資源。
/images/pic1.png;colors=rgb;resolution=high

2. 實戰案例

2.1 案例1 

@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) ;}

請求N9J28資訊網——每日最新資訊28at.com

圖片圖片N9J28資訊網——每日最新資訊28at.com

2.2 案例2

多個矩陣變量,在不同的路徑變量中定義N9J28資訊網——每日最新資訊28at.com

@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) ;}

請求N9J28資訊網——每日最新資訊28at.com

圖片圖片N9J28資訊網——每日最新資訊28at.com

2.3 案例3

使用Map接收矩陣值N9J28資訊網——每日最新資訊28at.com

@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) ;}

請求N9J28資訊網——每日最新資訊28at.com

圖片圖片N9J28資訊網——每日最新資訊28at.com

注意:這里的a=1,2有多個值可以使用','分割。N9J28資訊網——每日最新資訊28at.com

2.4 案例4

當變量路徑之后沒有添加矩陣參數時,會報錯。N9J28資訊網——每日最新資訊28at.com

圖片圖片N9J28資訊網——每日最新資訊28at.com

我們可以通過配置,指定非必須活著設定默認值。N9J28資訊網——每日最新資訊28at.com

@GetMapping("/m2/{cateId}/a2/{artId}")  public Object matrix2(      ...,      // 設置默認值      @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) ;  }

3. 實現原理

這里以上面的 案例2 講解。N9J28資訊網——每日最新資訊28at.com

3.1 路徑匹配存儲矩陣變量

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.mappingN9J28資訊網——每日最新資訊28at.com

圖片圖片N9J28資訊網——每日最新資訊28at.com

lookupPathN9J28資訊網——每日最新資訊28at.com

圖片圖片N9J28資訊網——每日最新資訊28at.com

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注解的參數N9J28資訊網——每日最新資訊28at.com

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);      }    }    // 返回數據    return paramValues.get(0);  }}

以上本篇文章的全部內容,希望對你有所幫助。N9J28資訊網——每日最新資訊28at.com

完畢!??!N9J28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-75322-0.html是否還記得SpringMVC中的@MatrixVariable注解?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一個超冷門的 Vue3 內置組件,幫我優化了66%的性能!

下一篇: Android平臺原生音視頻編解碼MediaCodec介紹

標簽:
  • 熱門焦點
Top