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"); } }
-