当前位置:首页 > 科技  > 软件

是否还记得SpringMVC中的@MatrixVariable注解?

来源: 责编: 时间:2024-02-29 14:41:19 279观看
导读环境:SpringBoot3.0.51. 简介RFC 3986【https://datatracker.ietf.org/doc/html/rfc3986#section-3.3】讨论了路径段中的name-value对。在Spring MVC中,我们将它们称为“矩阵变量”,但它们也可以称为URI路径参数。矩阵变

环境:SpringBoot3.0.5j2A28资讯网——每日最新资讯28at.com

1. 简介

RFC 3986【https://datatracker.ietf.org/doc/html/rfc3986#section-3.3】讨论了路径段中的name-value对。在Spring MVC中,我们将它们称为“矩阵变量”,但它们也可以称为URI路径参数。j2A28资讯网——每日最新资讯28at.com

矩阵变量可以出现在任何路径段中,每个变量用分号分隔,多个值用逗号分隔(例如/cars;color=red,green;year=2012)。还可以通过重复的变量名指定多个值(例如,color=red;color=green;color=blue)。j2A28资讯网——每日最新资讯28at.com

如果期望URL包含矩阵变量,则控制器方法的请求映射必须使用URI变量来屏蔽变量内容,并确保请求可以成功匹配,而不依赖于矩阵变量的顺序和存在。下面的例子使用了一个矩阵变量:j2A28资讯网——每日最新资讯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应用场景j2A28资讯网——每日最新资讯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) ;}

请求j2A28资讯网——每日最新资讯28at.com

图片图片j2A28资讯网——每日最新资讯28at.com

2.2 案例2

多个矩阵变量,在不同的路径变量中定义j2A28资讯网——每日最新资讯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) ;}

请求j2A28资讯网——每日最新资讯28at.com

图片图片j2A28资讯网——每日最新资讯28at.com

2.3 案例3

使用Map接收矩阵值j2A28资讯网——每日最新资讯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) ;}

请求j2A28资讯网——每日最新资讯28at.com

图片图片j2A28资讯网——每日最新资讯28at.com

注意:这里的a=1,2有多个值可以使用','分割。j2A28资讯网——每日最新资讯28at.com

2.4 案例4

当变量路径之后没有添加矩阵参数时,会报错。j2A28资讯网——每日最新资讯28at.com

图片图片j2A28资讯网——每日最新资讯28at.com

我们可以通过配置,指定非必须活着设定默认值。j2A28资讯网——每日最新资讯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 讲解。j2A28资讯网——每日最新资讯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.mappingj2A28资讯网——每日最新资讯28at.com

图片图片j2A28资讯网——每日最新资讯28at.com

lookupPathj2A28资讯网——每日最新资讯28at.com

图片图片j2A28资讯网——每日最新资讯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注解的参数j2A28资讯网——每日最新资讯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);  }}

以上本篇文章的全部内容,希望对你有所帮助。j2A28资讯网——每日最新资讯28at.com

完毕!!!j2A28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-75322-0.html是否还记得SpringMVC中的@MatrixVariable注解?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 一个超冷门的 Vue3 内置组件,帮我优化了66%的性能!

下一篇: Android平台原生音视频编解码MediaCodec介绍

标签:
  • 热门焦点
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    7月27日消息,据外媒报道,从三星电子所发布的财报来看,他们主要利润来源的存储芯片业务在今年二季度仍不乐观,营收同比仍在大幅下滑,所在的设备解决方案
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top