@RequestMapping是Spring MVC中的核心注解,用于将请求路径映射到特定的控制器方法。它具有多个属性,使得处理器方法能够只响应满足特定条件的请求。表2-2列出了@RequestMapping注解的主要属性及其用法。
表2-2 @RequestMapping的主要及其用法属性
@RequestMapping提供了灵活的URL匹配机制,允许通过多种方式指定请求与处理器方法间的映射关系。在实践中,最常用的匹配方式包括基于value属性的请求路径匹配和基于method属性的请求方法匹配。
最简单的方式就是直接指定一个路径。例如,@RequestMapping("/books")会将所有发送到/books的请求映射到控制器方法,具体示例如下。
@RestController public class BookController { @RequestMapping("/books") public List<String> getAllBooks() { return Arrays.asList("The Great Gatsby", "Moby Dick", "War and Peace"); } }
此外,@RequestMapping还支持使用通配符来进行更灵活的路径匹配。
?:匹配单个字符。例如,/boo?s可以匹配/books或/boots,但不匹配/booos。
*:匹配路径的一个部分。例如,/users/*可以匹配/users/1或/users/john,但不匹配/users或/users/1/details。
**:匹配路径的多个部分。例如,/users/**可以匹配/users/1、/users/john、/users/1/details等。
使用通配符的示例代码如下。
@RequestMapping("/users/*") @RequestMapping("/users/**")
@RequestMapping既可以用于控制器类级别,也可以用于方法级别。当它被同时应用于类和方法时,类级别和方法级别的URL模式会组合在一起。例如:
@RestController @RequestMapping("/api") public class BookController { // 将处理发送到"/api/books"的请求 @RequestMapping("/books") public List<String> getAllBooks() { return Arrays.asList("The Great Gatsby", "Moby Dick", "War and Peace"); } }
在上述代码中,所有发送到/api/books的请求都会被映射到getAllBooks()方法。当@RequestMapping应用于类级别时,它为该类中的所有方法定义了一个基础URI,可以被视为所有方法共享的“前缀”。因此,类级别的模式与方法级别的模式组合在一起,形成了最终的请求映射路径。
在控制器方法中,可以通过在路径中使用{variableName}的格式来捕获URL的一部分作为路径变量。这些变量随后可以在控制器的处理器方法中通过@PathVariable注解进行访问。例如:
@RequestMapping("/books/{bookId}") public String getBook(@PathVariable String bookId) { // 打印传递的bookId System.out.println(bookId); // 假设返回与bookId相关的书籍信息 return "The Great Gatsby"; }
@RequestMapping注解的method属性允许我们根据HTTP请求的方法(如GET、POST、PUT、DELETE等)来进一步限定请求的匹配。这意味着可以将特定的HTTP方法映射到相应的处理器方法上。
例如,指定单个HTTP方法:
@RequestMapping(value = "/users", method = RequestMethod.GET)
指定多个HTTP方法:
@RequestMapping(value = "/users", method = { RequestMethod.GET, RequestMethod.POST })
为了简化开发和提高代码的可读性,Spring还提供了一些快捷注解,它们实际上是@RequestMapping的预设版本。
@GetMapping:对应HTTP的GET方法。
@PostMapping:对应HTTP的POST方法。
@PutMapping:对应HTTP的PUT方法。
@DeleteMapping:对应HTTP的DELETE方法。
@PatchMapping:对应HTTP的PATCH方法。
使用这些快捷注解,上述例子可以被更简洁地表示为:
@GetMapping("/users") @PostMapping("/users")
通过结合基于路径和HTTP方法的匹配,@RequestMapping提供了一种灵活的方式来定义请求与处理器方法之间的映射关系。