# `Spring`笔记 - 公共AI网站:https://chatgptplus.cn/ - vue3官网:https://cn.vuejs.org/ - SpringBoot官网:https://docs.spring.io/spring-boot/index.html ## 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}`,因为它更精确。 ## 编写Spring应用 ### `@SpringBootApplication` 注解 1. **`@EnableAutoConfiguration`**: - 这个注解让 Spring Boot 根据项目中的依赖,自动配置 Spring 应用程序。Spring Boot 提供了大量的自动配置支持,帮助我们省去手动配置许多常见的功能。 - 例如,如果你的项目中加入了 `spring-boot-starter-web` 依赖,Spring Boot 会自动配置一个嵌入式的 Tomcat 服务器和一些常见的 Web 功能。 2. **`@ComponentScan`**: - 这个注解启用 Spring 的组件扫描机制。它会扫描当前类所在的包及其子包,自动发现并注册 `@Component`、`@Service`、`@Repository`、`@Controller` 等注解标注的类。 - 通过 `@ComponentScan`,你不需要手动指定要扫描的包,Spring Boot 会自动扫描当前包及其子包下的所有组件。 3. **`@Configuration`**: - 这个注解表示该类是一个 Spring 配置类,类似于 XML 配置文件,用于定义 Spring 应用的 Bean 配置。 - 该类可以包含 `@Bean` 注解的方法,返回要管理的 Bean。 ### `@SpringBootTest` 注解 `@SpringBootTest` 注解是用于测试 Spring Boot 应用的一个重要注解,它提供了一种方便的方式来启动 Spring Boot 应用上下文,并对整个 Spring Boot 应用进行集成测试。这个注解本身也包含了多个注解,它使得我们能够在测试类中创建一个完整的 Spring 容器来进行集成测试。 具体来说,`@SpringBootTest` 是一个组合注解,它整合了以下几个主要的注解: 1. **`@ContextConfiguration`**: - `@ContextConfiguration` 注解用于加载 Spring 配置文件或者配置类,在测试时会初始化 Spring 容器。`@SpringBootTest` 默认会加载 Spring Boot 应用的主配置类(即包含 `@SpringBootApplication` 注解的类),作为 Spring 容器的上下文。 - 它的作用是让测试类能够加载到 Spring 配置并创建一个完整的应用上下文。 2. **`@TestExecutionListeners`**: - 该注解指定了测试执行时的监听器。在 Spring 测试框架中,`@TestExecutionListeners` 会提供某些扩展功能,如事务管理、环境配置等,但它的实际作用在大多数测试中不太明显,通常由 Spring Boot 自动配置。 3. **`@DirtiesContext`**: - 这个注解会告诉 Spring 在测试执行之后清除(或重置)应用上下文,通常用于测试中的应用上下文需要被清理或重置,以避免测试间的相互影响。`@SpringBootTest` 会根据需要处理上下文的清理工作。 4. **`@BootstrapWith`**: - 这个注解是用于引导测试的,它会指定 `SpringBootTestContextBootstrapper` 来启动 Spring Boot 测试上下文。这是一个 Spring Boot 测试框架中的内部机制,用于初始化应用上下文并准备测试。 ### 测试页面 编写控制界面,返回`index.html` ```java @RequestMapping @Controller public class HomeController { @Operation(summary = "主页内容") @GetMapping("index") public String index() { return "index"; } } ``` 测试页面返回结果 ```java @WebMvcTest(HomeController.class) class HomeControllerTest { @Autowired private MockMvc mockMvc; @Test void index() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/"))// 访问路径 .andExpect(MockMvcResultMatchers.status().isOk())// 判断状态是否成功 .andExpect(MockMvcResultMatchers.view().name("index"))// 判断视图名称是否是index // 是否包含字段 .andExpect(MockMvcResultMatchers.content().string(Matchers.containsString("欢迎。。。"))); } } ``` 访问index的页面 ```html
Welcome, admin!
You are not an admin!
Welcome,