在 Spring 框架中,我们主要使用两个注解来处理 Web 请求:INLINECODE191ca4e5 和 INLINECODE2db3783f。虽然乍看之下它们有些相似,但它们的设计初衷并不相同:
@Controller通常用于基于 MVC 的 Web 应用(即返回 HTML 视图)。@RestController则用于构建 RESTful API(即返回 JSON/XML 响应)。
@Controller 注解
@Controller是 Spring 中的一个注解,用于在 MVC(模型-视图-控制器)应用程序中定义 Web 控制器。- 它通常与视图解析器(如 Thymeleaf、JSP 或 FreeMarker)协同工作,用于返回 HTML 页面。
- 如果你希望返回 JSON/XML 数据,必须在每个方法上添加
@ResponseBody注解。
示例:在 Spring MVC 应用中使用 @Controller
Java
@Controller
public class HomeController {
@GetMapping("/home")
public String homePage(Model model) {
model.addAttribute("message", "Welcome to Spring MVC!");
// 返回一个视图(例如 home.html 或 home.jsp)
return "home";
}
}
解释:
@Controller注解将该类标记为一个 Spring MVC 控制器。- INLINECODE3f1b6db8 方法映射了 INLINECODE885f409e 路径,并返回一个名为
home的视图。
[@RestController](https://www.geeksforgeeks.org/advance-java/spring-rest-controller/)注解专门用于创建 RESTful Web 服务。- 该注解用于类级别,允许该类处理客户端发出的请求。
RestController能够处理所有的 REST API,包括 GET、POST、Delete 和 PUT 请求。- 它在功能上等价于 -> INLINECODE19ad56d8 + INLINECODEc95be151 的组合。
示例:在 REST API 中使用 @RestController
Java
@RestController
public class ProductController {
@GetMapping("/product")
public Product getProduct() {
return new Product(1, "Laptop", 80000);
}
}
解释:
- INLINECODE93aaa341 注解结合了 INLINECODE8f515af3 和
@ResponseBody的功能。 getProduct()方法返回一个 Product 对象,该对象会自动转换为 JSON 格式。
@Controller vs @RestController
下表清晰地展示了 Spring 中 INLINECODEb491b8b2 和 INLINECODE5f7213d0 注解的区别。
@Controller
—
该注解用于将类标记为 Spring MVC 控制器。
继承自 INLINECODEe1088551 注解。
在 Spring Web MVC 中返回视图。
需要配合 INLINECODE646004a4 才能发送 JSON 或 XML 格式的响应。
用于返回视图(JSP、Thymeleaf)的传统 MVC 应用。
引入于 Spring 2.5。
何时使用哪一个
何时使用 @Controller:
- 当你正在构建返回 HTML 页面的 Web 应用程序时。
- 当你希望与前端模板引擎(如 Thymeleaf 或 JSP)进行集成时。
何时使用 @RestController:
- 当你正在为移动应用、单页应用(SPA)或微服务构建 REST API 时。
- 当你需要以 JSON/XML 格式交换数据时。