--- title: "04-RestController和Controller" created: 2025-12-02 tags: - 项目 aliases: - RestController和Controller --- # RestController和Controller `@RestController` 和 `@Controller` 是 Spring Framework 中用于处理 HTTP 请求的两个注解,主要用于定义控制器(Controller)类 ### `@Controller` - **用途**: 用于标识一个类为 Spring MVC 控制器,处理请求并返回视图(通常是 JSP、Thymeleaf 等)。 - **返回类型**: 默认情况下,使用 `@Controller` 的方法返回的是视图名称(视图解析),需要与 `@RequestMapping` 一起使用来处理请求。 - **示例**: ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/user") public class UserController { @GetMapping("/profile") public String getUserProfile() { return "profile"; // 返回视图名称 } } ``` ### 2. `@RestController` - **用途**: 是 `@Controller` 的一个变体,专用于处理 RESTful API 的请求。它自动将返回对象转换为 JSON 或 XML 格式。 - **返回类型**: 默认情况下,`@RestController` 方法返回的是数据(如 Java 对象),会被自动序列化为 JSON,通常用于 RESTful 服务。 - **示例**: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserRestController { @GetMapping("/api/user") public User getUser() { return new User(1, "John Doe"); // 返回 User 对象,会自动转换为 JSON } } ``` `@RestController` 实际上是 `@Controller` 和 `@ResponseBody` 的组合 `@Controller` - **基本功能**: 用于定义一个控制器,处理 HTTP 请求。 - **返回视图**: 默认情况下,`@Controller` 的方法返回的是一个视图名称,Spring 会根据这个名称找到对应的视图(如 JSP 或 Thymeleaf 模板)并渲染它。 `@ResponseBody` - **基本功能**: 用于指示 Spring 将方法的返回值直接写入 HTTP 响应体,而不是视图名称。 - **返回数据**: 当方法上使用了 `@ResponseBody` 注解,Spring 会自动将返回的对象序列化成 JSON 或 XML,并发送给客户端。 `@RestController` - **组合功能**: `@RestController` 是一个方便的注解,它实际上是 `@Controller` 和 `@ResponseBody` 的组合。 - **自动响应数据**: 所有 `@RestController` 中的方法返回的对象都将被自动序列化为 JSON,并写入响应体中,适合构建 RESTful API。 举例 使用 `@Controller` 和 `@ResponseBody` ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MyController { @GetMapping("/data") @ResponseBody public User getData() { return new User(1, "John Doe"); // 直接返回对象 } } ``` 在上面的例子中,`@ResponseBody` 注解用于指示 Spring 将 `getData` 方法的返回值直接写入响应体。 使用 `@RestController` ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyRestController { @GetMapping("/api/data") public User getData() { return new User(1, "John Doe"); // 自动转换为 JSON } } ``` 在这个例子中,`@RestController` 直接实现了与 `@Controller` + `@ResponseBody` 相同的效果,但写法更简洁。 ### 总结 - `@Controller`: 用于传统的 MVC 模式,通常返回视图名称,适合处理网页请求。 - `@RestController`: 专门用于 RESTful API,自动将返回值转换为 JSON 格式,适合处理数据请求。 选择使用哪一个注解取决于你的应用需求:如果是返回 HTML 视图,使用 `@Controller`;如果是返回数据(JSON/XML),使用 `@RestController`。 - `@RestController` = `@Controller` + `@ResponseBody` - 使用 `@RestController` 更方便,尤其是在构建 RESTful API 时,因为它自动处理返回值的序列化和响应体的写入。 - 如果你只使用 `@Controller`,且需要返回 JSON 数据,就必须在每个需要的地方加上 `@ResponseBody`。 --- **项目分区导航**: [[03-MyBatis-MyBatis-plus|MyBatis-MyBatis-plus]] ⬅️ | 04-RestController和Controller | ➡️ [[05-加密原理|加密原理]]