@RestController 和 @Controller 的区别

@RestController@Controller 的区别

在 Spring 框架中,@RestController@Controller 都是用于定义控制器的注解,但它们的用途和行为有所不同。以下是它们的区别:


  1. 基本定义
  • @Controller:

    • 是一个通用的注解,用于标识一个类是 Spring MVC 的控制器。
    • 默认情况下,@Controller 的方法会返回视图名称(View Name),并结合视图解析器(ViewResolver)渲染页面。
  • @RestController:

    • @Controller@ResponseBody 的组合注解。
    • 方法的返回值会被直接写入 HTTP 响应体中,通常用于开发 RESTful API。

  1. 返回值处理方式
注解 返回值处理方式
@Controller 方法返回值被视为视图名称(如 JSP、Thymeleaf 页面),由视图解析器处理并渲染页面。
@RestController 方法返回值会被直接序列化为 JSON 或 XML 格式,并写入 HTTP 响应体中。

  1. 使用场景
  • @Controller:

    • 适用于传统的 Web 应用开发,返回 HTML 页面。
    • 示例:用户登录后跳转到主页,或者显示表单页面。
  • @RestController:

    • 适用于开发 RESTful API,返回 JSON 或 XML 数据。
    • 示例:提供接口供前端或第三方系统调用,返回数据而不是页面。

  1. 代码示例

(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.htmlcourseList.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"]
    

  1. 内部实现
  • @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

posted @ 2025-03-15 13:02  吴少奇  阅读(358)  评论(0)    收藏  举报