在 Spring Framework 中,@RestController@Controller 都用于定义控制器类,但它们在功能和用法上有一些区别。

@Controller

@Controller 是一个用于定义 Spring MVC 控制器的注解。它用于标记一个类作为处理 Web 请求的控制器组件。通常,@Controller 用于传统的 MVC 模式,其中控制器负责处理请求,返回视图名称(如 JSP 页面),由视图解析器渲染成 HTML。

示例:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {

    @GetMapping("/greeting")
    public String greeting(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "greeting"; // 返回视图名称,视图解析器会将其解析为 /WEB-INF/views/greeting.jsp
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

在这个例子中,greeting 方法处理 GET 请求并返回一个视图名称 greeting,视图解析器会根据这个名称找到对应的视图文件。

@RestController

@RestController 是一个复合注解,实际上它是 @Controller@ResponseBody 的组合。它用于创建 RESTful Web 服务的控制器类,其中控制器方法的返回值直接作为 HTTP 响应体,而不是视图名称。这使得 @RestController 非常适合用于返回 JSON、XML 或其他格式的数据。

示例:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyRestController {

    @GetMapping("/greeting")
    public Greeting greeting() {
        return new Greeting("Hello, World!");
    }

    public static class Greeting {
        private String message;

        public Greeting(String message) {
            this.message = message;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

在这个例子中,greeting 方法返回一个 Greeting 对象,Spring 会自动将其序列化为 JSON(或其他指定的格式)并作为响应体返回。

总结
  • @Controller:用于传统的 Web 应用程序中,返回视图名称由视图解析器渲染成 HTML 页面。
  • @RestController:用于创建 RESTful Web 服务,返回的对象会直接作为 HTTP 响应体,通常用于返回 JSON 或 XML 数据。

选择使用 @Controller 还是 @RestController 主要取决于的应用需求。如果需要生成 HTML 页面并渲染视图,使用 @Controller。如果需要处理 RESTful API 并返回数据,使用 @RestController