@RequestMapping
注解是 Spring MVC 框架中用于路由 HTTP 请求到相应处理方法的核心注解之一。它能够将客户端发起的 HTTP 请求映射到具体的控制器(Controller)类及其方法上,从而实现请求的处理逻辑。@RequestMapping
可以应用在类或方法上,通过指定 URL 路径、HTTP 请求方法(如 GET、POST 等)、请求参数、请求头等条件来精确匹配请求。本文将探讨 @RequestMapping
注解的作用和使用方法。
1. 基本使用
类级别注解
当 @RequestMapping
注解应用在类级别时,它指定了该控制器处理请求的基础路径。所有在这个控制器类中定义的方法级别的 @RequestMapping
注解都会基于这个基础路径。
@Controller
@RequestMapping("/user")
public class UserController {
// 方法级别的 @RequestMapping 会基于类级别的路径
}
上面的例子中,UserController
类的基础路径是 /user
。这意味着,这个控制器中所有方法处理的请求 URL 都会以 /user
开头。
方法级别注解
在方法级别上,@RequestMapping
可以进一步指定具体的请求路径和 HTTP 方法。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/profile", method = RequestMethod.GET)
public String getUserProfile() {
// 处理 GET /user/profile 请求
return "userProfile";
}
@RequestMapping(value = "/profile", method = RequestMethod.POST)
public String updateUserProfile() {
// 处理 POST /user/profile 请求
return "updateSuccess";
}
}
在这个例子中,getUserProfile
方法处理的是 GET /user/profile
请求,而 updateUserProfile
方法处理的是 POST /user/profile
请求。
2. 支持的属性
@RequestMapping
注解提供了多个属性来精确匹配请求。
value
或path
:用于指定请求的 URL 路径。method
:指定请求的 HTTP 方法(GET、POST、PUT、DELETE 等)。params
:指定请求必须包含的参数。headers
:指定请求必须包含的 HTTP 头。consumes
:指定处理请求的提交内容类型(Content-Type),如application/json
。produces
:指定返回的内容类型,如application/json
。
示例:使用属性进行精确匹配
@Controller
@RequestMapping("/search")
public class SearchController {
@RequestMapping(
value = "/results",
method = RequestMethod.GET,
params = {"query", "type"},
headers = "Accept=application/json",
produces = "application/json"
)
public @ResponseBody List<SearchResult> search() {
// 处理符合条件的请求,并返回 JSON 格式的结果
return new ArrayList<>();
}
}
在这个例子中,search
方法处理的请求必须满足以下条件:
- URL 路径为
/search/results
。 - HTTP 方法为 GET。
- 请求参数必须包含
query
和type
。 - 请求头中必须包含
Accept=application/json
。 - 响应的内容类型为
application/json
。
3. 简化注解
为了简化常见的 HTTP 方法映射,Spring 提供了一系列特定的注解,如 @GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
等,它们是 @RequestMapping
的简化形式。
@Controller
@RequestMapping("/product")
public class ProductController {
@GetMapping("/{id}")
public String getProduct(@PathVariable Long id) {
// 处理 GET /product/{id} 请求
return "productDetail";
}
@PostMapping
public String createProduct() {
// 处理 POST /product 请求
return "productCreated";
}
@PutMapping("/{id}")
public String updateProduct(@PathVariable Long id) {
// 处理 PUT /product/{id} 请求
return "productUpdated";
}
@DeleteMapping("/{id}")
public String deleteProduct(@PathVariable Long id) {
// 处理 DELETE /product/{id} 请求
return "productDeleted";
}
}
4. @RequestMapping
的高级用法
路径变量(@PathVariable)
路径变量允许你将 URL 中的一部分作为参数传递到控制器方法中。
@RequestMapping(value = "/user/{userId}", method = RequestMethod.GET)
public String getUser(@PathVariable("userId") Long userId) {
// 处理 GET /user/{userId} 请求,其中 {userId} 是路径变量
return "userInfo";
}
请求参数(@RequestParam)
@RequestParam
注解用于将请求参数绑定到控制器方法的参数上。
@RequestMapping(value = "/search", method = RequestMethod.GET)
public String search(@RequestParam("query") String query) {
// 处理 GET /search?query=xxx 请求
return "searchResults";
}
请求体(@RequestBody)
@RequestBody
注解用于将 HTTP 请求体绑定到控制器方法的参数上,通常用于处理 JSON 或 XML 数据。
@RequestMapping(value = "/user", method = RequestMethod.POST)
public String createUser(@RequestBody User user) {
// 处理 POST /user 请求,请求体为 JSON 格式的 User 对象
return "userCreated";
}
响应体(@ResponseBody)
@ResponseBody
注解用于将控制器方法的返回值作为 HTTP 响应体返回,通常用于返回 JSON 或 XML 数据。
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
public @ResponseBody User getUser(@PathVariable Long id) {
// 处理 GET /user/{id} 请求,返回 JSON 格式的 User 对象
return new User(id, "Name");
}
5. 总结
@RequestMapping
注解是 Spring MVC 中用于映射 HTTP 请求到控制器方法的强大工具。通过灵活运用其各种属性,你可以精确地控制哪些请求被哪个方法处理。此外,Spring 还提供了一系列简化的注解(如 @GetMapping
)来进一步简化配置。结合路径变量、请求参数、请求体和响应体的使用,你可以构建出功能丰富、响应迅速的 Web 应用程序。
在实际开发中,合理设计 URL 结构、选择合适的 HTTP 方法、正确处理请求和响应,都是构建高质量 Web 服务的关键。@RequestMapping
及其相关注解为你提供了强大的支持,帮助你实现这些目标。