跳到主要内容
版本:7.0.3

矩阵变量

Hunyuan 7b 中英对照 Matrix Variables

RFC 3986讨论了路径段中的名称-值对。在Spring MVC中,我们根据Tim Berners-Lee的一篇“旧文章”将其称为“矩阵变量”,但它们也可以被称为URI路径参数。

矩阵变量可以出现在任何路径段中,每个变量之间用分号(;)分隔,多个值之间用逗号(,)分隔(例如,/cars;color=red,green;year=2012)。也可以通过重复的变量名来指定多个值(例如,color=red;color=green;color=blue)。

如果一个URL预期包含矩阵变量(matrix variables),那么控制器方法(controller method)的请求映射必须使用URI变量来屏蔽这些变量的内容,以确保无论矩阵变量的顺序和是否存在如何,请求都能成功匹配。以下示例中使用了矩阵变量:

// GET /pets/42;q=11;r=22

@GetMapping("/pets/{petId}")
public void findPet(@PathVariable String petId, @MatrixVariable int q) {

// petId == 42
// q == 11
}

鉴于所有路径段都可能包含矩阵变量,有时你可能需要明确该矩阵变量应该位于哪个路径段中。以下示例展示了如何实现这一点:

// GET /owners/42;q=11/pets/21;q=22

@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(
@MatrixVariable(name="q", pathVar="ownerId") int q1,
@MatrixVariable(name="q", pathVar="petId") int q2) {

// q1 == 11
// q2 == 22
}

如以下示例所示,矩阵变量可以被定义为可选的,并指定一个默认值:

// GET /pets/42

@GetMapping("/pets/{petId}")
public void findPet(@MatrixVariable(required=false, defaultValue="1") int q) {

// q == 1
}

要获取所有矩阵变量,可以使用MultiValueMap,如下例所示:

// GET /owners/42;q=11;r=12/pets/21;q=22;s=23

@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(
@MatrixVariable MultiValueMap<String, String> matrixVars,
@MatrixVariable(pathVar="petId") MultiValueMap<String, String> petMatrixVars) {

// matrixVars: ["q" : [11,22], "r" : 12, "s" : 23]
// petMatrixVars: ["q" : 22, "s" : 23]
}

请注意,您需要启用矩阵变量的使用。在MVC XML命名空间中,您可以设置<mvc:annotation-driven enable-matrix-variables="true"/>