1.@Controller与@RestController对比
Spring MVC 中 @Controller 与 @RestController 的功能对比:
- @Controller是Spring MVC中用于标识一个类作为控制器的标准注解。它允许处理HTTP请求,并返回视图名称,通常和视图解析器一起使用来渲染页面。
- 而@RestController是Spring 4.0引入的,它结合了@Controller和@ResponseBody两个注解的功能,主要用于构建RESTful Web服务,直接返回响应体数据,比如JSON或XML,而不是视图。
| 注解 | 功能描述 |
|---|---|
@Controller | 标识一个类为 Spring MVC 控制器,处理 HTTP 请求并返回视图名称 或 ModelAndView。 |
@RestController | 组合注解,等效于 @Controller + @ResponseBody,返回值直接写入 HTTP 响应体(如 JSON/XML),不经过视图解析器。 |
@Controller 与 @RestController 的关键区别:
| 特性 | @Controller | @RestController |
|---|---|---|
| 返回值类型 | 通常返回视图名称(String)或 ModelAndView | 返回任意对象(如 POJO),自动序列化为 JSON/XML |
| 是否需要视图解析器 | ✅ 是(需配合模板引擎如 Thymeleaf) | ❌ 否(直接写入响应体) |
是否自动添加 @ResponseBody | ❌ 否 | ✅ 是 |
| 适用场景 | 传统服务端渲染网页(如 JSP/Thymeleaf) | 构建 RESTful API(前后端分离项目) |
2. 使用示例
2.1 代码演示
准备工作:下面代码演示所需的 User 实体类定义如下
public class User {
private String name;
private String email;
// 构造方法、Getter 和 Setter
public User(String name, String email) {
this.name = name;
this.email = email;
}
// Getter 和 Setter 省略
}
2.1.1 使用 @Controller
使用 @Controller 返回String类型的视图名称 或 ModelAndView:
@Controller
public class ViewController {
//case1.处理请求并返回视图名称 userProfile(对应 templates/userProfile.html)
@GetMapping("/user/{id}")
public String getUserProfile(@PathVariable String id, Model model) {
User user = new User("Alice", "alice@example.com");
model.addAttribute("user", user); // 将数据传递给视图
return "userProfile"; // 返回视图名称
}
//case2.处理请求并返回ModelAndView
@GetMapping("/userV2/{id}")
public ModelAndView getUser(@PathVariable String id) {
User user = new User("Alice", "alice@example.com");
ModelAndView modelAndView = new ModelAndView("userProfile");
modelAndView.addObject("user", user);
return modelAndView;
}
}
其中,视图文件(src/main/resources/templates/userProfile.html)定义如下:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<h1>User Profile</h1>
<p>Name: <span th:text="${user.name}"></span></p>
<p>Email: <span th:text="${user.email}"></span></p>
</body>
</html>
访问路径:GET http://localhost:8080/user/1
输出:渲染后的 HTML 页面,显示用户信息。
2.1.2 使用 @RestController
使用 @RestController 返回 JSON:
@RestController
@RequestMapping("/api")
public class UserController {
// 处理请求并返回 JSON 数据
@GetMapping("/user/{id}")
public User getUser(@PathVariable String id) {
return new User("Bob", "bob@example.com"); // 直接返回对象
}
}
访问路径:GET http://localhost:8080/api/user/1
输出:JSON
{
"name": "Bob",
"email": "bob@example.com"
}
2.2 使用说明
2.2.1 核心处理流程对比
| 处理步骤 | @Controller | @RestController |
|---|---|---|
| 请求映射 | @RequestMapping 或 @GetMapping 等 | @RequestMapping 或 @GetMapping 等 |
| 返回值处理 | 返回视图名称或ModelAndView,需视图解析器渲染 | 返回对象,自动序列化为 JSON/XML |
| 数据传递 | 通过 Model 参数传递数据给视图 | 无需 Model,直接返回数据对象 |
| 依赖组件 | 视图解析器(ViewResolver)、模板引擎 | HttpMessageConverter(如 Jackson) |
2.2.2 适用场景建议
- 使用
@Controller的场景:- 传统 Web 应用,服务端渲染 HTML 页面。
- 需要结合模板引擎(如 Thymeleaf、JSP)。
- 使用
@RestController的场景:- 构建前后端分离的 RESTful API。
- 返回 JSON/XML 数据给前端(如 Vue/React 应用)。
- 微服务架构中的服务间通信。
2.2.3. 补充说明
@RestController是 Spring 4.0 引入的,简化了 RESTful API 的开发。- 若需在
@Controller中返回 JSON 数据,可单独添加@ResponseBody注解到方法或类级别:-
@Controller public class MixedController { @GetMapping("/user/json") @ResponseBody public User getUserAsJson() { return new User("Charlie", "charlie@example.com"); } }
-


















