RestController和Controller
@RestController 和 @Controller 是 Spring Framework
中用于处理 HTTP 请求的两个注解,主要用于定义控制器(Controller)类
@Controller
- 用途: 用于标识一个类为 Spring MVC 控制器,处理请求并返回视图(通常是 JSP、Thymeleaf 等)。
- 返回类型: 默认情况下,使用
@Controller的方法返回的是视图名称(视图解析),需要与@RequestMapping一起使用来处理请求。 - 示例:
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 服务。 - 示例:
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
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
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。
项目分区导航: MyBatis-MyBatis-plus ⬅️ | 04-RestController和Controller | ➡️ 加密原理
💬 评论