# Ant风格访问

Spring MVC 支持 **Ant 风格**（Ant-style path matching）主要体现在 URL 路径匹配模式上。这种模式是 Spring Web 框架用来进行 URL 模式匹配的一种方式，借用了 Apache Ant（一个流行的 Java 构建工具）中的路径匹配规则。Ant 风格的路径匹配使得 URL 路径映射更加灵活和方便。

+ `*` 匹配单一路径层级中的任意字符。
+ `**` 匹配任意多个路径层级。
+ `?` 匹配单个字符。

## 1. Ant 风格路径匹配规则
Ant 风格的路径匹配规则中有几个特殊字符，分别是 `*`、`**` 和 `?`，它们具有不同的匹配意义：

### (1) `*`（匹配零个或多个字符）
+ `*` 可以匹配路径中的任何部分，但只能匹配单一层级中的路径。
+ 举个例子，`/foo/*` 可以匹配 `/foo/bar` 或 `/foo/abc`，但不能匹配 `/foo/bar/baz`。
+ 示例：
    - `/foo/*` 匹配 `/foo/bar`。
    - `/foo/*/bar` 匹配 `/foo/abc/bar`。

### (2) `**`（匹配零个或多个目录）
+ `**` 可以匹配多个目录层级，它比 `*` 更加强大，能够跨越多个层级。
+ 示例：
    - `/foo/**/bar` 匹配 `/foo/bar`、`/foo/abc/bar`、`/foo/abc/def/bar` 等。
    - `/foo/**/bar/**/baz` 匹配 `/foo/abc/bar/xyz/baz`。

### (3) `?`（匹配单个字符）
+ `?` 用于匹配单个字符，不是零个或多个字符。它通常用于精确匹配某些路径中的单个字符。
+ 示例：
    - `/foo/a?c` 可以匹配 `/foo/abc`，但不能匹配 `/foo/abcc`。

## 2. Ant 风格的路径匹配应用
Spring MVC 采用了这种路径匹配方式，使得映射 URL 路径时更加灵活。例如，使用 `@RequestMapping` 注解来定义控制器方法时，可以利用 Ant 风格的路径匹配规则。

### 示例 1：`@RequestMapping` 使用 Ant 风格
```java
@Controller
public class MyController {

    @RequestMapping("/foo/*")  // 匹配路径 /foo/bar 或 /foo/abc
    public String handleFoo() {
        return "foo";
    }

    @RequestMapping("/foo/**") // 匹配路径 /foo/bar 或 /foo/abc/xyz
    public String handleFooRecursive() {
        return "fooRecursive";
    }

    @RequestMapping("/foo/a?c") // 匹配路径 /foo/abc，但不匹配 /foo/abcc
    public String handleSpecificPattern() {
        return "specificPattern";
    }
}
```

在这个例子中：

+ `/foo/*` 只会匹配 `/foo/bar` 或 `/foo/abc` 等简单路径。
+ `/foo/**` 会匹配 `/foo/bar`、`/foo/abc/xyz` 等多层次路径。
+ `/foo/a?c` 会匹配 `/foo/abc`，但不会匹配 `/foo/abcc`。

### 示例 2：`@RequestMapping` 配合请求方法
Spring MVC 还支持在映射中结合请求方法（如 `GET`、`POST`）来实现更细粒度的路径匹配：

```java
@Controller
@RequestMapping("/foo")
public class FooController {

    @RequestMapping(value = "/bar/*", method = RequestMethod.GET)  // GET 请求
    public String handleBar() {
        return "barGET";
    }

    @RequestMapping(value = "/bar/**", method = RequestMethod.POST) // POST 请求
    public String handleBarPost() {
        return "barPOST";
    }
}
```

在这个例子中：

+ `/foo/bar/*` 仅在处理 `GET` 请求时匹配。
+ `/foo/bar/**` 仅在处理 `POST` 请求时匹配。

## 3. Ant 风格路径与通配符的结合使用
在实际开发中，Spring MVC 支持 Ant 风格路径的同时，还可以与路径变量、正则表达式等功能结合使用。

### 示例 1：路径变量 + Ant 风格
```java
@RequestMapping("/user/{id}/**") // 匹配多层路径，id 为路径变量
public String handleUser(@PathVariable("id") String userId) {
    return "User ID: " + userId;
}
```

+ 这个路径匹配 `/user/123/abc/xyz`，其中 `id` 会捕获为 `123`。

### 示例 2：正则表达式 + Ant 风格
```java
@RequestMapping("/product/{id:\\d+}/**") // 正则匹配数字 id
public String handleProduct(@PathVariable("id") String productId) {
    return "Product ID: " + productId;
}
```

+ 这里的路径 `/product/{id:\\d+}/**` 只会匹配数字形式的 `id`，比如 `/product/123/abc/xyz`。

## 4. 优先级和匹配规则
在使用 Ant 风格路径匹配时，路径匹配的优先级有一定的规则。具体来说，`/**` 会匹配任何路径，所以它的优先级通常较低，避免与其他精确匹配的路径冲突。

### 示例：优先级比较
```java
@Controller
@RequestMapping("/foo")
public class FooController {

    @RequestMapping("/foo/{id}") // 精确匹配路径 /foo/{id}
    public String handleFoo(@PathVariable String id) {
        return "foo:" + id;
    }

    @RequestMapping("/foo/**") // 匹配所有以 /foo/ 开头的路径
    public String handleFooCatchAll() {
        return "catchAll";
    }
}
```

在这个例子中，如果访问 `/foo/bar`，它会首先匹配 `/foo/{id}`，因为它更精确。

## 
