Spring MVC 注解详解及使用示例

Spring MVC 是 Spring 框架中的一个模块,专注于简化 Web 应用的开发。通过一系列注解,Spring MVC 提供了灵活的请求处理机制,使得控制器代码更加简洁易懂。在本文中,我们将详细介绍常用的 Spring MVC 注解,并提供代码示例,帮助你更好地理解和使用这些注解。

1. @Controller - 标记控制器类

@Controller 用于标记一个类是 Spring MVC 的控制器(Controller),该类中的方法可以处理 HTTP 请求。Spring 容器会自动检测标注了 @Controller 的类,并将其作为 Spring MVC 的组件。

示例:

@Controller
public class HomeController {
    @RequestMapping("/home")
    public String home() {
        return "home"; // 返回视图名为 "home"
    }
}

2. @RequestMapping - 请求映射

@RequestMapping 用于定义 URL 与控制器方法之间的映射。它可以注解在类和方法上,用来指定请求的路径、HTTP 方法等。

属性:
  • value:定义 URL 路径。
  • method:指定请求方法(如 GET、POST)。
  • params:指定请求参数,限制匹配的请求。
  • headers:定义请求头信息。
示例:
@Controller
@RequestMapping("/api")
public class UserController {

    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public String getUsers() {
        return "userList"; // 返回视图名
    }

    @RequestMapping(value = "/users", method = RequestMethod.POST)
    public String addUser() {
        return "userForm"; // 返回视图名
    }
}

3. @GetMapping@PostMapping@PutMapping@DeleteMapping - 请求方法简化注解

这些注解是 @RequestMapping 的简化形式,用于指定特定的 HTTP 方法请求,代码更加简洁。

示例:
@Controller
@RequestMapping("/products")
public class ProductController {

    @GetMapping("/{id}")
    public String getProduct(@PathVariable("id") String id) {
        return "productDetail";
    }

    @PostMapping
    public String createProduct() {
        return "productForm";
    }

    @PutMapping("/{id}")
    public String updateProduct(@PathVariable("id") String id) {
        return "productForm";
    }

    @DeleteMapping("/{id}")
    public String deleteProduct(@PathVariable("id") String id) {
        return "productList";
    }
}

4. @PathVariable - 获取路径变量

@PathVariable 用于绑定 URL 中的路径变量到方法参数。路径变量在 RESTful 风格的 URL 中经常用到,例如 /user/1 中的 1 是用户ID。

示例:
@GetMapping("/user/{userId}")
public String getUser(@PathVariable("userId") String userId) {
    System.out.println("User ID: " + userId);
    return "userDetail";
}

5. @RequestParam - 获取请求参数

@RequestParam 用于绑定 URL 中的查询参数到方法参数,例如 /search?keyword=spring

示例:
@GetMapping("/search")
public String search(@RequestParam("keyword") String keyword) {
    System.out.println("Keyword: " + keyword);
    return "searchResults";
}

6. @RequestBody - 解析请求体数据

@RequestBody 将请求体中的 JSON 数据绑定到方法参数对象中。常用于接收 POST 请求中的 JSON 数据。

示例:
@PostMapping("/user")
public String createUser(@RequestBody User user) {
    System.out.println("User Name: " + user.getName());
    return "userDetail";
}

7. @ResponseBody - 返回 JSON 数据

@ResponseBody 用于将方法的返回值直接作为 HTTP 响应体返回,常用于返回 JSON 数据。可以配合 @RestController 使用。

示例:
@ResponseBody
@GetMapping("/api/user/{id}")
public User getUserJson(@PathVariable("id") String id) {
    User user = new User();
    user.setId(id);
    user.setName("John Doe");
    return user;
}

8. @RestController - 简化 @Controller@ResponseBody

@RestController@Controller@ResponseBody 的组合注解,适用于需要直接返回 JSON 或其他对象的控制器类。

示例:
@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable("id") String id) {
        User user = new User();
        user.setId(id);
        user.setName("John Doe");
        return user;
    }
}

9. @ModelAttribute - 绑定模型数据

@ModelAttribute 可以用于方法参数和方法上。参数上使用时,可以绑定表单数据到对象中;方法上使用时,可以在每个请求之前执行,用来预先准备模型数据。

示例:
@ModelAttribute("user")
public User createUser() {
    return new User(); // 创建一个空的用户对象
}

@PostMapping("/user")
public String saveUser(@ModelAttribute("user") User user) {
    System.out.println("User Name: " + user.getName());
    return "userDetail";
}

10. @SessionAttributes - 存储模型数据到 Session

@SessionAttributes 用于将某些模型数据存储到 Session 中,常用于需要跨请求保存数据的场景。

示例:
@Controller
@SessionAttributes("user")
public class UserController {

    @ModelAttribute("user")
    public User createUser() {
        return new User();
    }

    @PostMapping("/user")
    public String saveUser(@ModelAttribute("user") User user) {
        return "userDetail";
    }
}

11. @ExceptionHandler - 异常处理

@ExceptionHandler 用于定义方法来处理控制器中的异常,可以根据异常类型来选择不同的方法处理。

示例:
@Controller
public class ErrorController {

    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        System.out.println("Exception: " + e.getMessage());
        return "error";
    }
}

总结

本文介绍了 Spring MVC 中的核心注解,了解这些注解可以帮助我们更高效地构建 Web 应用。通过结合这些注解的使用,你可以更加灵活地处理请求、解析数据、处理异常。希望这篇博客能够帮助你更好地理解 Spring MVC 的注解机制!