1. @RestController
• @RestController 是 Spring 4.0 引入的一个注解,它相当于 @Controller + @ResponseBody组合注解。
主要作用:主要用于构建 RESTful Web 服务。标注 @RestController 的类里的所有方法,返回的都是 JSON 或 XML 等格式的数据,而不是视图页面。
• 自动返回数据:与 @Controller 不同,@RestController 下的每个方法默认都会将返回的对象序列化为 JSON 或 XML,并直接写入 HTTP 响应体。你无需在每个方法上再加 @ResponseBody。
• 返回值处理:它默认将控制器中的所有方法的返回值转换为 JSON 或其他格式的数据输出到响应体中,而不会尝试解析为视图名称。
因此,当你在类上使用了 @RestController 时,你返回的数据如“login”,Spring 会认为这是要返回给前端的数据,而不是视图名称。它不会去解析和渲染页面,前端只收到一个字符串 "login"。
2. @Controller
• @Controller 是用于传统的 Spring MVC 模式,它通常用于处理页面导航和视图渲染。
主要作用:@Controller 用于标识一个类是 Spring MVC 的控制器。控制器类中的方法通常返回的是视图名称,Spring 会通过视图解析器来找到对应的视图模板,并将该视图渲染成 HTML 页面返回给客户端。
示例:如下代码,如果使用@Controller,则会默认为templates/login.html
@RequestMapping("/toLogin")
public String toLogin() {
// 返回的是视图名称 "login",由视图解析器去查找对应的模板文件(如 login.html)
return "login";
}
• 返回视图 vs. 数据:@Controller 返回的通常是视图名称(比如 Thymeleaf 模板、JSP 页面)。但是如果你希望返回 JSON 或其他格式的数据,而不是页面,则需要在方法上加@ResponseBody 注解,那么Spring 便不会将数据解析为文件。
• 视图解析器:如果你返回的内容是一个字符串,Spring MVC 会把这个字符串当作视图的名称,交给视图解析器去找到对应的模板来渲染页面。
• 返回值处理:当你返回一个字符串时,Spring MVC 会将这个字符串视为视图的名称,使用视图解析器(如 Thymeleaf)去找到对应的视图模板,然后渲染页面。
3.区别
特性 |
@Controller |
@RestController |
---|---|---|
返回类型 |
默认返回视图名称(页面模板)。 |
返回的是 JSON 或 XML 格式的数据。 |
数据返回 |
需要配合 @ResponseBody 才能返回 JSON 数据。 |
自动返回 JSON 数据,无需 @ResponseBody。 |
使用场景 |
适合返回视图页面的场景(如网页、HTML)。 |
适合构建 RESTful API,返回数据给客户端。 |
数据格式 |
视图名称,页面渲染。 |
返回 JSON、XML 或其他类型的数据。 |
常见用法 |
与视图模板引擎(如 Thymeleaf、JSP)配合使用。 |
4. 适用场景?
• 如果你要构建的是一个 Web 应用,且需要返回 HTML 页面(如前端需要加载不同的页面),应使用 @Controller (常用于前后端不分离场景)。
• 如果你要构建的是一个 RESTful API,客户端只需要接收 JSON 数据而不是页面内容,应该使用 @RestController(常用于前后端分离场景)。
5.总结
• @RestController:适合构建 REST API,返回 JSON、XML 等格式的数据,不用于返回视图页面。
• @Controller:适合处理页面请求,返回视图名称,由视图解析器渲染页面,若不想返回数据解析为视图名称,则需要在对应方法上加上@ResponseBody 注解即可。