原文: http://zetcode.com/spring/matrixvariable/

Spring @MatrixVariable教程展示了如何使用@MatrixVariable解析 URL 参数。

Spring 是用于创建企业应用的流行 Java 应用框架。

@MatrixVariable

@MatrixVariable用于解析路径段中的名称-值对,并将它们绑定到方法参数。 多对用分号分隔。 必须首先启用矩阵变量。

Spring @MatrixVariable示例

以下应用解析 URL 路径段中的名称/值对。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. ├───config
  8. MyWebInitializer.java
  9. WebConfig.java
  10. └───controller
  11. MyController.java
  12. ├───resources
  13. └───webapp
  14. index.html
  15. └───test
  16. └───java

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>matrixvariableex</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>war</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>11</maven.compiler.source>
  14. <maven.compiler.target>11</maven.compiler.target>
  15. <spring-version>5.1.3.RELEASE</spring-version>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>javax.servlet</groupId>
  20. <artifactId>javax.servlet-api</artifactId>
  21. <version>4.0.1</version>
  22. <scope>provided</scope>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-webmvc</artifactId>
  27. <version>${spring-version}</version>
  28. </dependency>
  29. </dependencies>
  30. <build>
  31. <plugins>
  32. <plugin>
  33. <groupId>org.apache.maven.plugins</groupId>
  34. <artifactId>maven-war-plugin</artifactId>
  35. <version>3.2.2</version>
  36. </plugin>
  37. <plugin>
  38. <groupId>org.eclipse.jetty</groupId>
  39. <artifactId>jetty-maven-plugin</artifactId>
  40. <version>9.4.14.v20181114</version>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

pom.xml文件中,我们具有项目依赖项。

com/zetcode/config/MyWebInitializer.java

  1. package com.zetcode.config;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.context.WebApplicationContext;
  4. import org.springframework.web.servlet.DispatcherServlet;
  5. import org.springframework.web.servlet.FrameworkServlet;
  6. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  7. @Configuration
  8. public class MyWebInitializer extends
  9. AbstractAnnotationConfigDispatcherServletInitializer {
  10. @Override
  11. protected Class<?>[] getRootConfigClasses() {
  12. return null;
  13. }
  14. @Override
  15. protected Class<?>[] getServletConfigClasses() {
  16. return new Class[]{WebConfig.class};
  17. }
  18. @Override
  19. protected String[] getServletMappings() {
  20. return new String[]{"/"};
  21. }
  22. }

MyWebInitializer初始化 Spring Web 应用。 它包含一个配置类:WebConfig

com/zetcode/config/WebConfig.java

  1. package com.zetcode.config;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
  5. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  6. import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
  7. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  8. import org.springframework.web.util.UrlPathHelper;
  9. @Configuration
  10. @EnableWebMvc
  11. @ComponentScan(basePackages = {"com.zetcode"})
  12. public class WebConfig implements WebMvcConfigurer {
  13. @Override
  14. public void configurePathMatch(PathMatchConfigurer configurer) {
  15. var urlPathHelper = new UrlPathHelper();
  16. urlPathHelper.setRemoveSemicolonContent(false);
  17. configurer.setUrlPathHelper(urlPathHelper);
  18. }
  19. @Override
  20. public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
  21. configurer.enable();
  22. }
  23. }

WebConfig配置 Spring Web 应用。

  1. @Override
  2. public void configurePathMatch(PathMatchConfigurer configurer) {
  3. var urlPathHelper = new UrlPathHelper();
  4. urlPathHelper.setRemoveSemicolonContent(false);
  5. configurer.setUrlPathHelper(urlPathHelper);
  6. }

在这里,我们启用矩阵变量。

com/zetcode/controller/MyController.java

  1. package com.zetcode.controller;
  2. import org.springframework.http.MediaType;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.MatrixVariable;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import java.util.Map;
  8. @RestController
  9. public class MyController {
  10. @GetMapping(value = "/user/{first}/{last}",
  11. produces = MediaType.TEXT_PLAIN_VALUE)
  12. public String handler1(@MatrixVariable("first") String first,
  13. @MatrixVariable("last") String last) {
  14. return String.format("Hello %s %s", first, last);
  15. }
  16. @GetMapping(value = "/data/{user:.*}",
  17. produces = MediaType.TEXT_PLAIN_VALUE)
  18. public String handler2(@MatrixVariable Map<String, String> data) {
  19. return String.format("Id: %s\nFirst name: %s\nLast Name: %s\nEmail: %s\n",
  20. data.get("id"), data.get("first"), data.get("last"), data.get("email"));
  21. }
  22. @GetMapping(value = "/geo/{continent}",
  23. produces = MediaType.TEXT_PLAIN_VALUE)
  24. public String handler3(@PathVariable("continent") String continent,
  25. @MatrixVariable("country") String country,
  26. @MatrixVariable("capital") String capital) {
  27. return String.format("Continent: %s\nCountry: %s\nCapital: %s\n",
  28. continent, country, capital);
  29. }
  30. }

MyController包含请求路径到处理器方法的映射。

  1. @GetMapping(value = "/user/{first}/{last}",
  2. produces = MediaType.TEXT_PLAIN_VALUE)
  3. public String handler1(@MatrixVariable("first") String first,
  4. @MatrixVariable("last") String last) {
  5. return String.format("Hello %s %s", first, last);
  6. }

在这里,我们使用@MatrixVariable将多个矩阵变量绑定到方法参数。

  1. @GetMapping(value = "/data/{user:.*}",
  2. produces = MediaType.TEXT_PLAIN_VALUE)
  3. public String handler2(@MatrixVariable Map<String, String> data) {
  4. return String.format("Id: %s\nFirst name: %s\nLast Name: %s\nEmail: %s\n",
  5. data.get("id"), data.get("first"), data.get("last"), data.get("email"));
  6. }

在这里,我们将多个名称/值对映射到一个映射中。

  1. @GetMapping(value = "/geo/{continent}",
  2. produces = MediaType.TEXT_PLAIN_VALUE)
  3. public String handler3(@PathVariable("continent") String continent,
  4. @MatrixVariable("country") String country,
  5. @MatrixVariable("capital") String capital) {
  6. return String.format("Continent: %s\nCountry: %s\nCapital: %s\n",
  7. continent, country, capital);
  8. }

在第三种情况下,我们将@MatrixVariable@PathVariable结合在一起。

webapp/index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Home page</title>
  6. </head>
  7. <body>
  8. <p>
  9. <a href="http://localhost:8080/user/first=John/last=Doe">Greet user</a>
  10. </p>
  11. <p>
  12. <a href="http://localhost:8080/data/id=1;first=John;last=Doe;email=johndoe@gmail.com">Show user data</a>
  13. </p>
  14. <p>
  15. <a href="http://localhost:8080/geo/Europe;country=Slovakia;capital=Bratislava">Show country info</a>
  16. </p>
  17. </body>
  18. </html>

这是主页。 我们有三个链接,这些链接包含使用@MatrixVariable注解解析的名称/值对。

在本教程中,我们使用@MatrixVariable解析路径段上的名称/值对并将其绑定到方法参数。

您可能也对这些相关教程感兴趣: Spring @GetMapping教程Spring DefaultServlet教程Spring Web 应用简介Java 教程