@Controller 与 @RestController-笔记

1.@Controller@RestController对比

Spring MVC 中 @Controller 与 @RestController 的功能对比:

  • @Controller是Spring MVC中用于标识一个类作为控制器的标准注解。它允许处理HTTP请求,并返回视图名称通常和视图解析器一起使用来渲染页面
  • 而@RestController是Spring 4.0引入的,它结合了@Controller和@ResponseBody两个注解的功能,主要用于构建RESTful Web服务,直接返回响应体数据,比如JSON或XML,而不是视图。
注解功能描述
@Controller标识一个类为 Spring MVC 控制器,处理 HTTP 请求并返回视图名称 或 ModelAndView
@RestController组合注解,等效于 @Controller + @ResponseBody,返回值直接写入 HTTP 响应体(如 JSON/XML),不经过视图解析器

 @Controller 与 @RestController 的关键区别:

特性@Controller@RestController
返回值类型通常返回视图名称(String)或 ModelAndView返回任意对象(如 POJO),自动序列化为 JSON/XML
是否需要视图解析器✅ 是(需配合模板引擎如 Thymeleaf)❌ 否(直接写入响应体)
是否自动添加 @ResponseBody❌ 否✅ 是
适用场景传统服务端渲染网页(如 JSP/Thymeleaf)构建 RESTful API(前后端分离项目)

2. 使用示例

2.1 代码演示

准备工作:下面代码演示所需的 User 实体类定义如下

public class User {
    private String name;
    private String email;

    // 构造方法、Getter 和 Setter
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // Getter 和 Setter 省略
}

2.1.1 使用 @Controller 

使用 @Controller 返回String类型的视图名称 或 ModelAndView:

@Controller
public class ViewController {

    //case1.处理请求并返回视图名称 userProfile(对应 templates/userProfile.html)
    @GetMapping("/user/{id}")
    public String getUserProfile(@PathVariable String id, Model model) {
        User user = new User("Alice", "alice@example.com");
        model.addAttribute("user", user); // 将数据传递给视图
        return "userProfile"; // 返回视图名称
    }


    //case2.处理请求并返回ModelAndView
    @GetMapping("/userV2/{id}")
    public ModelAndView getUser(@PathVariable String id) {
        User user = new User("Alice", "alice@example.com");
        ModelAndView modelAndView = new ModelAndView("userProfile");
        modelAndView.addObject("user", user);
        return modelAndView;
    }
}

其中,视图文件(src/main/resources/templates/userProfile.html)定义如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <body>
    <h1>User Profile</h1>
    <p>Name: <span th:text="${user.name}"></span></p>
    <p>Email: <span th:text="${user.email}"></span></p>
  </body>
</html>

访问路径GET http://localhost:8080/user/1
输出:渲染后的 HTML 页面,显示用户信息。

2.1.2 使用 @RestController

使用 @RestController 返回 JSON:

@RestController
@RequestMapping("/api")
public class UserController {

    // 处理请求并返回 JSON 数据
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable String id) {
        return new User("Bob", "bob@example.com"); // 直接返回对象
    }
}

访问路径GET http://localhost:8080/api/user/1

输出:JSON

{
  "name": "Bob",
  "email": "bob@example.com"
}

2.2 使用说明

2.2.1 核心处理流程对比

处理步骤@Controller@RestController
请求映射@RequestMapping 或 @GetMapping 等@RequestMapping 或 @GetMapping 等
返回值处理返回视图名称或ModelAndView,需视图解析器渲染返回对象,自动序列化为 JSON/XML
数据传递通过 Model 参数传递数据给视图无需 Model,直接返回数据对象
依赖组件视图解析器(ViewResolver)、模板引擎HttpMessageConverter(如 Jackson)

2.2.2 适用场景建议

  • 使用 @Controller 的场景
    • 传统 Web 应用,服务端渲染 HTML 页面。
    • 需要结合模板引擎(如 Thymeleaf、JSP)。
  • 使用 @RestController 的场景
    • 构建前后端分离的 RESTful API。
    • 返回 JSON/XML 数据给前端(如 Vue/React 应用)。
    • 微服务架构中的服务间通信。

2.2.3. 补充说明

  • @RestController 是 Spring 4.0 引入的,简化了 RESTful API 的开发。
  • 若需在 @Controller 中返回 JSON 数据,可单独添加 @ResponseBody 注解到方法或类级别:
    • @Controller
      public class MixedController {
      
          @GetMapping("/user/json")
          @ResponseBody
          public User getUserAsJson() {
              return new User("Charlie", "charlie@example.com");
          }
      }
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值