成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
矩陣變量可以出現在任何路徑段中,每個變量用分號分隔,多個值用逗號分隔(例如/cars;color=red,green;year=2012)。還可以通過重復的變量名指定多個值(例如,color=red;color=green;color=blue)。

環境:SpringBoot3.0.5

1. 簡介

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

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

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

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

@MatrixVariable應用場景

  • 主要適用于需要在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) ;
}

請求

圖片圖片

2.2 案例2

多個矩陣變量,在不同的路徑變量中定義

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

請求

圖片圖片

2.3 案例3

使用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有多個值可以使用','分割。

2.4 案例4

當變量路徑之后沒有添加矩陣參數時,會報錯。

圖片圖片

我們可以通過配置,指定非必須活著設定默認值。

@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 講解。

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.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注解的參數

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

以上本篇文章的全部內容,希望對你有所幫助。

完畢!!!

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2020-10-12 08:43:25

Java基礎知識

2012-06-26 09:14:08

OpenSolaris

2011-06-27 14:08:21

Linux歷史命令

2015-07-13 09:04:10

互聯網設備設備

2012-05-04 08:16:47

Windows XP

2018-12-27 11:58:07

蘋果手機iPhone

2021-05-05 14:00:25

QQ手機QQ移動應用

2015-07-20 16:58:35

短信微信

2015-04-21 14:04:35

iOS

2021-04-07 22:25:05

手機LG諾基亞

2015-07-02 14:00:04

高考查分深信服

2019-03-19 18:47:56

手機摩托羅拉諾基亞

2017-01-13 08:00:39

手機

2020-07-14 13:40:42

微軟開發AI

2017-10-09 11:21:09

安卓APPFlash

2020-02-18 15:59:51

計算機網絡中數據鏈路

2021-09-05 20:18:33

邊緣計算組成

2022-11-28 20:01:19

Node.js?Deno

2018-08-30 21:35:00

App StoreFacebook印象筆記

2019-05-22 17:55:36

瀏覽器 Chrome Google
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精彩免费视频 | 欧一区二区 | 欧美综合一区二区三区 | 91精品国产综合久久精品图片 | 成人永久免费视频 | 欧美视频一区 | 女同久久另类99精品国产 | 91在线区| 国产精品欧美一区二区三区 | 欧美理论在线观看 | 日韩久草| 国产精品视频久久久久 | 精品福利在线 | 国产精品日产欧美久久久久 | 日韩三级在线观看 | 毛色毛片免费看 | 欧美一级特黄aaa大片在线观看 | 亚洲一区二区三区在线播放 | 盗摄精品av一区二区三区 | 国产午夜视频 | 国产精品不卡 | 亚洲精品888 | 亚洲一区二区久久 | 国产国拍亚洲精品av | 国产日韩精品在线 | 国产日韩精品一区 | 91精品国产一区二区三区 | 亚洲天堂av网 | 黑人粗黑大躁护士 | 精品国产伦一区二区三区观看方式 | www.日日干 | 国产精品久久久久久久久久久久 | 男人天堂网址 | www.成人免费视频 | 欧美h视频 | 久久久久99 | 99在线播放| 成人免费在线电影 | 国内精品视频免费观看 | 日韩一区二区在线视频 | 亚洲福利视频一区二区 |