@RestController
和 @Controller
的区别
在 Spring 框架中,@RestController
和 @Controller
都是用于定义控制器的注解,但它们的用途和行为有所不同。以下是它们的区别:
- 基本定义
-
@Controller
:- 是一个通用的注解,用于标识一个类是 Spring MVC 的控制器。
- 默认情况下,
@Controller
的方法会返回视图名称(View Name),并结合视图解析器(ViewResolver)渲染页面。
-
@RestController
:- 是
@Controller
和@ResponseBody
的组合注解。 - 方法的返回值会被直接写入 HTTP 响应体中,通常用于开发 RESTful API。
- 是
- 返回值处理方式
注解 | 返回值处理方式 |
---|---|
@Controller |
方法返回值被视为视图名称(如 JSP、Thymeleaf 页面),由视图解析器处理并渲染页面。 |
@RestController |
方法返回值会被直接序列化为 JSON 或 XML 格式,并写入 HTTP 响应体中。 |
- 使用场景
-
@Controller
:- 适用于传统的 Web 应用开发,返回 HTML 页面。
- 示例:用户登录后跳转到主页,或者显示表单页面。
-
@RestController
:- 适用于开发 RESTful API,返回 JSON 或 XML 数据。
- 示例:提供接口供前端或第三方系统调用,返回数据而不是页面。
- 代码示例
(1) 使用 @Controller
@Controller
public class CourseController {@GetMapping("/courses")public String getCourses(Model model) {// 向模型中添加数据model.addAttribute("courses", List.of("Math", "Physics", "Chemistry"));// 返回视图名称return "courseList"; // 视图解析器会解析为 courseList.html 或 courseList.jsp}
}
- 说明: 返回值
"courseList"
是视图名称,Spring 会根据配置的视图解析器找到对应的模板文件(如courseList.html
或courseList.jsp
)并渲染页面。
(2) 使用 @RestController
@RestController
public class CourseRestController {@GetMapping("/courses")public List<String> getCourses() {// 直接返回数据return List.of("Math", "Physics", "Chemistry");}
}
- 说明: 返回值是一个
List<String>
,Spring 会将其序列化为 JSON 格式并直接写入 HTTP 响应体中,例如:["Math", "Physics", "Chemistry"]
- 内部实现
@RestController
:-
实际上是
@Controller
和@ResponseBody
的组合:@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller @ResponseBody public @interface RestController {String value() default ""; }
-
因此,
@RestController
的所有方法默认都会被加上@ResponseBody
,返回值不会经过视图解析器处理。
-
总结
特性 | @Controller |
@RestController |
---|---|---|
返回值处理 | 返回视图名称,渲染页面 | 返回数据,写入 HTTP 响应体 |
适用场景 | 传统 Web 应用,返回页面 | RESTful API 开发,返回 JSON 或 XML |
是否需要视图解析器 | 需要 | 不需要 |
是否自动加 @ResponseBody | 否 | 是 |
如果你正在开发一个返回 JSON 数据的 RESTful API,推荐使用 @RestController
;如果需要返回页面,则使用 @Controller
。