当前位置: 首页 > ai >正文

@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 和 Setterpublic 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")@ResponseBodypublic User getUserAsJson() {return new User("Charlie", "charlie@example.com");}
      }
      

http://www.xdnf.cn/news/6059.html

相关文章:

  • 架构设计不合理,如何优化系统结构
  • 设计并实现高并发系统,应用无锁编程与CAS机制
  • Android usb网络共享详解
  • Linux笔记---信号(中)
  • 计算机视觉----基础概念、卷积
  • 基于javaweb的SpringBoot自习室预约系统设计与实现(源码+文档+部署讲解)
  • VUE3 -综合实践(Mock+Axios+ElementPlus)
  • 基于Matlab的非线性Newmark法用于计算结构动力响应
  • 如何查看打开的 git bash 窗口是否是管理员权限打开
  • Oracle 中的虚拟列Virtual Columns和PostgreSQL Generated Columns生成列
  • win11 安装 wsl ubuntu 18.04后换源失败!
  • Void: Cursor 的开源平替
  • ET MessageQueue类分析
  • 汽车免拆诊断案例 | 2015款路虎极光车组合仪表提示“充电系统故障”
  • 第二个五年计划!
  • Android清单文件
  • No module named ‘OpenGL‘
  • 【SSL部署与优化​】​​HTTP/2与HTTPS的协同效应
  • Python uv包管理器使用指南:从入门到精通
  • 5.14本日总结
  • 地磁-惯性-视觉融合制导系统设计:现代空战导航的抗干扰解决方案
  • vue-ganttastic甘特图label标签横向滚动固定方法
  • ssh connect to remote gitlab without authority
  • 计算机网络-MPLS LDP基础实验配置
  • 在Oracle到GreatSQL迁移中排序规则改变引发的乱码问题分析及解决
  • 算法每日刷题 Day6 5.14:leetcode数组1道题,用时30min,明天按灵茶山艾府题单开刷,感觉数组不应该单算
  • 图论part10 bellman_ford算法
  • HCIP-BGP综合实验
  • 鸿蒙OSUniApp 实现一个精致的日历组件#三方框架 #Uniapp
  • AGI大模型(16):向量检索之基于向量检索的RAG实现