@Controller
和 @RestController
是 Spring MVC 中用于处理 HTTP 请求的注解,它们有以下区别:
-
返回值处理方式:
-
@Controller
用于定义一个传统的 Spring MVC 控制器,它的方法通常返回视图名称或ModelAndView
对象,由视图解析器解析并渲染成 HTML 页面。java@Controller public class MyController { @GetMapping("/hello") public String hello() { return "helloPage"; // 返回视图名称 } }
-
@RestController
组合了@Controller
和@ResponseBody
,用于定义 RESTful 风格的控制器。其方法的返回值会直接写入 HTTP 响应体,而不是通过视图解析器解析为视图。java@RestController public class MyRestController { @GetMapping("/api/hello") public String hello() { return "Hello, REST API!"; // 直接写入响应体 } }
-
-
默认响应类型:
@Controller
默认返回视图,通常使用ViewResolver
将逻辑视图名映射为实际视图。@RestController
默认返回 JSON 或 XML 格式的数据,而不是视图。
-
使用场景:
- 使用
@Controller
时,通常用于构建传统的 Web 应用,其中页面渲染由视图模板(如 JSP、Thymeleaf)处理。 - 使用
@RestController
时,适用于构建 RESTful API,其中数据以 JSON 或 XML 格式返回给客户端。
- 使用
实际例子:
java
@Controller
public class WebPageController {
@GetMapping("/helloPage")
public String helloPage() {
return "helloPage"; // 返回视图名称,通常由视图解析器解析为实际视图
}
}
java
@RestController
public class ApiController {
@GetMapping("/api/hello")
public String helloApi() {
return "Hello, REST API!"; // 直接返回字符串,将以 JSON 或 XML 格式写入响应体
}
}
在构建 Web 页面的场景中,使用 @Controller
处理用户请求,返回视图名称,然后由视图解析器解析为实际视图。而在构建 RESTful API 的场景中,使用 @RestController
直接返回数据,通常以 JSON 或 XML 格式。