1、知识点:
    1)、矩阵变量(访问路径上以“;”链接的数据)与对应的获取方法。

    • 矩阵变量格式一:

      1. - `<``a ``href``="getMatrixVariable/paths;username=``张三``;interesting=java;interesting=c++"``>@MatrixVariable</``a``>` 。其中,`paths` 代表整个矩阵变量的名称。
      • 获取方法一:

      ①、@RequestMapping``(value = ``"/getMatrixVariable/{path}"``)首先方法处理器中,通过EL表达式/{path}获取整个矩阵变量 paths
      ②、@PathVariable``(``"path"``) ``String ``path, 先得到@RequestMapping中,整个矩阵变量 paths+
      ③、@MatrixVariable``(``"username"``) ``String ``name。得到变量名为 username 的值 +
      ④、@MatrixVariable``(``"interesting"``) ``List``<``String``> interesting 得到所有变量名为interesting对应的所有的值的List集合。

    • 矩阵变量格式二:

      1. - `<``a ``href``="getMatrixVariable2/1;age=25/2;age=30"``>@MatrixVariable2</``a``>。`1表示id age=25表示id下的变量age=25
      • 获取方法二:

      ①、@RequestMapping``(value = ``"/getMatrixVariable2/{id1}/{id2}"``) 首先方法处理器中,通过EL表达式/{id1}/{id2}获取矩阵id 1与2
      ②、@MatrixVariable``(value = ``"age"``,pathVar = ``"id1"``) ``Integer ``age1,通过id获取,id对应的数据。
      慨念:

      1. - 根据 URI 规范 RFC 3986 URL 的定义,路径片段中可以可以包含键值对。规范中没对对应的术语。一般 URL 路径参数” 可以被应用,尽管更加独特的 “矩阵 URI 也经常被使用并且相当有名。在 Spring MVC 它被成为矩阵变量。
      2. - 矩阵变量可以出现在任何路径片段中,每一个矩阵变量都用分号(;)隔开。比如 `/cars;color=red;year=2012`”。多个值可以用逗号隔开,比如 `color=red,green,blue`”,或者分开写“`color=red;color=green;color=blue`”。
      3. - 如果你希望一个 URL 包含矩阵变量,那么请求映射模式必须用 URI 模板来表示这些矩阵变量。这样的话,不管矩阵变量顺序如何,都能够保证请求可以正确的匹配。

    2)、开启矩阵变量。
    方式一:Springboot 默认是无法使用矩阵变量绑定参数的。需要覆盖WebMvcConfigurer中的configurePathMatch方法。

    1. @Configuration
    2. public class WebConfig implements WebMvcConfigurer {
    3. @Override
    4. public void configurePathMatch(PathMatchConfigurer configurer) {
    5. UrlPathHelper urlPathHelper=new UrlPathHelper();
    6. //不移除,访问路径中分号“;”后面的数据。
    7. urlPathHelper.setRemoveSemicolonContent(false);
    8. configurer.setUrlPathHelper(urlPathHelper);
    9. }
    10. }

    方式二:在配置类中,重写 configurePathMatch 方法。

    image.png

    package com.wzy.springbootweb01.boot;
    
    @Configuration
    public class MyConfig {
        @Bean
        public WebMvcConfigurer webMvcConfigurer(){
            return new WebMvcConfigurer() {
                @Override
                public void configurePathMatch(PathMatchConfigurer configurer) {
                    UrlPathHelper urlPathHelper=new UrlPathHelper();
                    urlPathHelper.setRemoveSemicolonContent(false);
                    configurer.setUrlPathHelper(urlPathHelper);
                }
            };
        }
    }
    

    方式三:基于SringMVC配置XML文件。

    <mvc:annotation-driven enable-matrix-variables="true" />
    

    3、使用

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <a href="getMatrixVariable/paths;username=张三;interesting=java;interesting=c++">@MatrixVariable</a><br/>
        <a href="getMatrixVariable2/1;age=25/2;age=30">@MatrixVariable2</a><br/>
    </body>
    </html>
    
    package com.wzy.springbootweb01.controller;
    
    @RestController
    public class MyController2MatrixVariable {
        //@PathVariable +  @MatrixVariable 获取矩阵变量的值。
        @RequestMapping(value = "/getMatrixVariable/{path}",method = RequestMethod.GET)
        public Map getMatrixVariable(@PathVariable("path") String path,
                                     @MatrixVariable("username") String name,
                                     @MatrixVariable("interesting") List<String> interesting){
            Map<String,Object> map = new HashMap<>();
            map.put("path",path);
            map.put("username",name);
            map.put("interesting",interesting);
            return map;
    
        }
    
        //MatrixVariable获取矩阵变量的值。
        //getMatrixVariable2/1;age=25/2;age=30
        @RequestMapping(value = "/getMatrixVariable2/{id1}/{id2}",method = RequestMethod.GET)
        public Map getMatrixVariable2(@MatrixVariable(value = "age",pathVar = "id1") Integer age1,
                                      @MatrixVariable(value = "age",pathVar = "id1") Integer age2){
            Map<String,Object> map = new HashMap<>();
            map.put("age1",age1);
            map.put("age2",age2);
    
            return map;
    
        }
    }