前记:基础啊,区别点重点理解;
在Spring和Spring Boot框架中,@Controller
和@RestController
都用于处理HTTP请求,但它们在设计目的和用法上有显著区别。以下是它们的核心区别及示例说明:
1. 核心区别
特性 | @Controller | @RestController |
---|---|---|
用途 | 传统Web应用(返回视图名称) | RESTful API(直接返回数据,如JSON/XML) |
响应处理 | 默认返回视图名称,需配合@ResponseBody 返回数据 | 自动将返回值序列化为HTTP响应体(内置@ResponseBody ) |
视图解析器 | 需要视图解析器(如JSP、Thymeleaf) | 不需要视图解析器,直接返回数据 |
组合注解 | 无 | @Controller + @ResponseBody |
2. @Controller 用法示例
场景:传统Web应用,返回HTML视图。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class WebController {
// 返回视图名称(由视图解析器处理,如Thymeleaf)
@GetMapping("/home")
public String home() {
return "home"; // 对应src/main/resources/templates/home.html
}
// 需要显式添加@ResponseBody返回数据
@GetMapping("/data")
@ResponseBody
public String getData() {
return "Hello from @Controller!";
}
}
说明:
return "home"
:视图解析器会查找home.html
模板并渲染。@ResponseBody
:强制将返回值作为响应体(不经过视图解析器)。
3. @RestController 用法示例
场景:REST API,直接返回JSON数据。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ApiController {
// 自动将User对象序列化为JSON
@GetMapping("/user")
public User getUser() {
return new User("Alice", 30);
}
// 直接返回字符串
@GetMapping("/greeting")
public String greeting() {
return "Hello from @RestController!";
}
}
// 简单POJO类
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 省略getter/setter
}
说明:
- 所有方法默认使用
@ResponseBody
,返回值直接写入HTTP响应体。 - 返回对象会被自动序列化为JSON(需Jackson库支持,Spring Boot默认包含)。
4. 关键总结
-
使用
@Controller
时:- 适合需要服务端渲染的页面(如JSP、Thymeleaf)。
- 若返回数据,必须配合
@ResponseBody
。
-
使用
@RestController
时:- 专为REST API设计,直接返回数据(无需视图解析)。
- 简化代码,避免重复使用
@ResponseBody
。
5. 常见HTTP方法注解
两者均可使用@GetMapping
、@PostMapping
等快捷注解:
// 在@Controller或@RestController中均可使用
@PostMapping("/create")
public ResponseEntity<String> createUser(@RequestBody User user) {
// 处理创建逻辑
return ResponseEntity.ok("User created!");
}
通过合理选择@Controller
和@RestController
,可以高效构建传统Web应用或现代RESTful API。
(望各位潘安、各位子健/各位彦祖、于晏不吝赐教!多多指正!🙏)