@RestController和@Controller是Spring MVC中用于标记控制器类的注解,它们的主要区别在于处理HTTP响应的默认行为。当在一个带有@Controller注解的类或方法上同时使用@RequestMapping和@ResponseBody注解时,该方法的返回值会被转化为HTTP响应体的内容,就和@RestController的效果一样了
- @Controller:
-
@Controller
注解用于标记一个类作为Spring MVC中的控制器类,它主要用于处理HTTP请求并返回视图名称或ModelAndView对象,以便框架根据视图名称渲染相应的视图。- 当控制器方法返回一个ModelAndView对象时,Spring MVC会根据其中的视图名称查找并渲染视图模板,适合构建带有视图渲染的传统Web应用。
示例:
@Controller
public class TraditionalController {
@GetMapping("/hello")
public ModelAndView sayHello() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", "Hello World!");
modelAndView.setViewName("hello-view"); // 假设有名为hello-view的JSP或Thymeleaf模板
return modelAndView;
}
}
- @RestController:
-
@RestController
注解是@Controller和@ResponseBody的组合,它指示控制器方法直接返回序列化的数据(如JSON、XML等)而不是视图名或ModelAndView对象。- 当控制器方法返回一个简单的数据类型(如POJO、String、Map等)时,Spring MVC会自动将其转换为HTTP响应体的内容。
示例:
@RestController
public class RestfulController {
@GetMapping("/api/hello")
public Message sayHello() {
Message message = new Message("Hello World!");
return message;
}
// Message 是一个简单的 POJO 类
public class Message {
private String content;
public Message(String content) {
this.content = content;
}
// getter and setter methods...
}
}
在这个例子中,当访问 /api/hello
时,RestfulController将会返回一个JSON格式的消息对象,而不是试图寻找并渲染视图。在实际应用中,这很适合构建RESTful API服务,返回的数据通常会被客户端应用程序(如JavaScript、移动应用等)直接消费。
总结来说,@RestController本质上是@Controller和全局@ResponseBody的组合,它表明所有的方法都将返回纯数据而非视图。因此,虽然单独使用@Controller配合每个方法上的@RequestMapping和@ResponseBody能达到同样的效果,但@RestController提供了更加简洁和明确的声明方式。