日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

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

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

環(huán)境:SpringBoot3.0.5Tsh28資訊網(wǎng)——每日最新資訊28at.com

1. 簡介

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

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

如果期望URL包含矩陣變量,則控制器方法的請求映射必須使用URI變量來屏蔽變量內(nèi)容,并確保請求可以成功匹配,而不依賴于矩陣變量的順序和存在。下面的例子使用了一個矩陣變量:Tsh28資訊網(wǎng)——每日最新資訊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應(yīng)用場景Tsh28資訊網(wǎng)——每日最新資訊28at.com

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

2. 實戰(zhàn)案例

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

請求Tsh28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Tsh28資訊網(wǎng)——每日最新資訊28at.com

2.2 案例2

多個矩陣變量,在不同的路徑變量中定義Tsh28資訊網(wǎng)——每日最新資訊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) ;}

請求Tsh28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Tsh28資訊網(wǎng)——每日最新資訊28at.com

2.3 案例3

使用Map接收矩陣值Tsh28資訊網(wǎng)——每日最新資訊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) ;}

請求Tsh28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Tsh28資訊網(wǎng)——每日最新資訊28at.com

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

2.4 案例4

當(dāng)變量路徑之后沒有添加矩陣參數(shù)時,會報錯。Tsh28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Tsh28資訊網(wǎng)——每日最新資訊28at.com

我們可以通過配置,指定非必須活著設(shè)定默認(rèn)值。Tsh28資訊網(wǎng)——每日最新資訊28at.com

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

3. 實現(xiàn)原理

這里以上面的 案例2 講解。Tsh28資訊網(wǎng)——每日最新資訊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.mappingTsh28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Tsh28資訊網(wǎng)——每日最新資訊28at.com

lookupPathTsh28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Tsh28資訊網(wǎng)——每日最新資訊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注解的參數(shù)Tsh28資訊網(wǎng)——每日最新資訊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);      }    }    // 返回數(shù)據(jù)    return paramValues.get(0);  }}

以上本篇文章的全部內(nèi)容,希望對你有所幫助。Tsh28資訊網(wǎng)——每日最新資訊28at.com

完畢!!!Tsh28資訊網(wǎng)——每日最新資訊28at.com

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

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

上一篇: 一個超冷門的 Vue3 內(nèi)置組件,幫我優(yōu)化了66%的性能!

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

標(biāo)簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 罗江县| 吉林省| 杭锦旗| 奉节县| 上蔡县| 名山县| 视频| 华安县| 日照市| 冀州市| 蒙山县| 丰顺县| 花莲县| 镇赉县| 鹿泉市| 鸡泽县| 玉田县| 来宾市| 同心县| 白水县| 吴桥县| 永修县| 兰坪| 宜昌市| 深州市| 兴山县| 来凤县| 托里县| 邵阳县| 灯塔市| 大足县| 德昌县| 仙桃市| 凤凰县| 大足县| 扎囊县| 馆陶县| 同江市| 朝阳市| 锡林浩特市| 吉安市|