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