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

【SpringBoot】带你一文彻底搞懂RestController和Controller的关系与区别

目录

什么是@RestController,什么是@Controller??

使用@ResponseBody注解让方法返回值作为响应内容是什么意思

举例说明

@RestController

@Controller

什么时候需要返回的是视图,什么时候需要返回数据?

当设计 RESTful API 时,一般的原则是:

下面是一些示例情况:

再以实例说明,更通俗易懂的理解:

总结


什么是@RestController,什么是@Controller??

? ? @RestController@Controller是 Spring Framework 中用于定义控制器的注解。

? ? **@RestController**是一个组合注解它结合了@Controller@ResponseBody注解的功能(就相当于把两个注解组合在一起)。在使用@RestController注解标记的类中,每个方法的返回值都会以 JSON 或 XML 的形式直接写入 HTTP 响应体中,相当于在每个方法上都添加了@ResponseBody注解。

? ? **@Controller**注解标记的类则是传统的控制器类。它用于处理客户端发起的请求,并负责返回适当的视图(View)作为响应。在使用@Controller注解的类中,通常需要在方法上使用@ResponseBody注解来指示该方法的返回值要作为响应的主体内容,而不是解析为视图。

简而言之,@RestController适用于构建 RESTful 风格的 API,其中每个方法的返回值会直接序列化为 JSON 或 XML 数据并发送给客户端。而@Controller适用于传统的 MVC 架构,它负责处理请求并返回相应的视图。(@RestController下的方法默认返回的是数据格式,@Controller注解标注的类下面的方法默认返回的就是以视图为格式

使用@ResponseBody注解让方法返回值作为响应内容是什么意思

在使用@Controller注解标记的类中,默认情况下,方法的返回值会被解析为一个视图名称,并寻找与该名称匹配的视图进行渲染。这意味着返回的结果会被解析为一个 HTML 页面或者模板引擎所需的数据。

但是有时候需要将方法的返回值直接作为响应的主体内容,而不是解析为视图。为了实现这个目的,我们可以在方法上使用@ResponseBody注解。

??@ResponseBody注解表示方法的返回值应该直接写入 HTTP 响应体中,而不是被解析为视图。它告诉 Spring MVC 框架将方法的返回值序列化为特定格式(如 JSON、XML 等)并作为响应的主体内容返回给客户端。

下面是一个使用@Controller@ResponseBody的示例:

@Controller @RequestMapping("/hello") public class HelloController { @GetMapping @ResponseBody public String sayHello() { return "Hello, World!"; } }

当客户端发起/hello的 GET 请求时,sayHello()方法会返回一个字符串 “Hello, World!”。因为在方法上使用了@ResponseBody注解,返回值不会被解析为视图,而是直接作为响应的主体内容返回给客户端。

举例说明

现在假设有一个简单的订单系统,其中有一个功能是获取订单信息。我们来看如何使用@RestController@Controller分别实现同一个功能:

@RestController

@RestController @RequestMapping("/orders") public class OrderController { @GetMapping("/{id}") public Order getOrderById(@PathVariable int id) { // 从数据库中获取订单信息 Order order = orderService.getOrderById(id); return order; } }

使用@RestController注解标记类,并在方法上使用@GetMapping注解定义了一个 GET 请求的处理方法。方法的返回值是Order类型的对象,它将会直接序列化为 JSON 格式的数据,并作为 HTTP 响应的主体内容返回给客户端。

@Controller

@Controller @RequestMapping("/orders") public class OrderController { @GetMapping("/{id}") @ResponseBody public ModelAndView getOrderById(@PathVariable int id) { // 从数据库中获取订单信息 Order order = orderService.getOrderById(id); ModelAndView modelAndView = new ModelAndView("order-details"); modelAndView.addObject("order", order); return modelAndView; } }

使用@Controller注解标记类,并在方法上使用@GetMapping注解定义了一个 GET 请求的处理方法。方法的返回值是ModelAndView类型的对象,它将包含要渲染的视图名称和需要传递给视图的数据。在方法上使用@ResponseBody注解,表示方法的返回值应该作为响应的主体内容,而不是解析为视图。

通俗一点说就是——有时候并不需要返回视图,只需要一组数据,这样在方法加上一个@ResponseBody,就可以让返回的格式转换为数据格式

什么时候需要返回的是视图,什么时候需要返回数据?

当设计 RESTful API 时,一般的原则是:

  • 如果客户端希望获取数据(例如 JSON、XML),则返回数据。
  • 如果客户端希望展示数据(例如 HTML 页面),则返回视图。

下面是一些示例情况:

  • 当你在开发一个单页应用的后端接口时,前端通常会通过 Ajax 请求获取数据(例如 JSON),然后使用 JavaScript 动态更新页面。在这种情况下,你应该返回数据(例如使用@ResponseBody注解)。
  • 当你需要为前端渲染 HTML 页面时,需要返回视图。视图可以包含动态生成的数据,但最终会经过服务器端模板引擎的处理,形成最终的 HTML 页面。

再以实例说明,更通俗易懂的理解:

  1. 需要返回视图的实例: 假设你正在开发一个博客应用的后端接口。有一个页面需要显示所有文章的列表,并且希望以 HTML 形式展示。在这种情况下,你可以设计一个 GET 请求的接口/api/articles,返回一个包含所有文章数据的视图,让前端直接展示这个页面。这里需要返回视图而不是仅返回数据,因为需要服务端渲染整个 HTML 页面。

  2. 只需要返回数据的实例: 假设正在开发一个电子商务网站,前端使用 React 或 Vue.js 等框架构建。在购物车页面上,需要获取当前用户的购物车数据以便展示。在这种情况下,你可以设计一个 GET 请求的接口/api/cart,返回一个 JSON 对象,包含当前用户的购物车数据。这里只需要返回数据而不是整个 HTML 页面,因为前端通过 JavaScript 来处理和展示数据。

总结

  • @RestController@Controller@ResponseBody的组合注解,用于创建 RESTful 风格的 API。
  • @RestController返回的数据会直接作为响应的主体内容(JSON 或 XML),不进行页面跳转或视图解析。
  • @Controller用于传统的 MVC 架构,负责处理请求并返回视图作为响应。
  • @Controller方法通常需要配合@ResponseBody注解,才能将返回值作为响应的主体内容。
  • 传统的springMVC一般就需要直接返回视图,而现在新兴的前端技术vue在项目中为前后端分离的架构,前端框架负责处理数据和渲染页面,而后端 API 则负责提供数据即可,所以对返回视图的要求也就比较少了
http://www.jsqmd.com/news/449739/

相关文章:

  • Java Util Concurrent(JUC)
  • 面试题:互斥锁与条件变量,在生产者消费者模型中的使用,lock在条件变量中的作用
  • UE5 编辑器下添加组件
  • 计算机毕业设计springboot校园疫情防范管理系统 高校疫情防控数字化管理平台 基于Spring Boot的校园防疫信息管理系统
  • WebRTC 视频编码丢帧与降低分辨率机制深度剖析
  • 甩锅防御机制:运维说“网络正常”时的专业应对策略
  • IPTV系统解决方案怎么选?从机顶盒到系统平台全解析
  • 计算机毕业设计springboot高校智慧党建管理系统 基于SpringBoot的数字化高校党务工作平台 SpringBoot驱动的大学党建信息化综合服务平台
  • GISBox vs GeoServer:谁才是现代GIS开发的更优解?
  • 大兴机场机位进出方案优化设计研究
  • jQuery day1
  • OpenAI GPT-5.4实测
  • 粉色PCB评测排名:猎板技术可靠,兼具颜值与性能
  • 从“踩坑无数”到“如获至宝”:我如何找到那家真正靠谱的AI服务商?
  • 毕业论文神器!冠绝行业的降AIGC平台 —— 千笔·降AI率助手
  • 内网两台 Linux 服务器高效传输大文件(70GB 实战指南)
  • LEDNum不是二进制数
  • 基于Java与SpringBoot集成卡证检测矫正模型:构建企业级OCR服务
  • 计算机毕业设计springboot室内设计类网站 基于SpringBoot的家居空间数字化设计平台 SpringBoot驱动的室内装潢方案在线定制系统
  • 【2025最新】基于SpringBoot+Vue的springbo共享单车数据存储系统管理系统源码+MyBatis+MySQL
  • 一次多agent情况下openclaw不回消息问题的排查经过(使用飞书通信,持续更新中~~~)
  • 【kv存储】持久化模块优化----内存映射取代拷贝式加载
  • 构建安全桥梁:前后端分离架构下的数据交互与防护指南
  • 基于粒子群算法优化bp神经网络(PSO-BP)回归预测模型 实现平台:Matlab 多特征输入
  • ebmap Tour 导览地图制作之 路网绘制
  • 写作小白救星 10个AI论文平台深度测评,专科生毕业论文写作必备!
  • 实测20款适合东南亚语言配音软件推荐,以下6款全支持
  • 拖延症福音!千笔·专业论文写作工具,领军级的AI论文平台
  • MATLAB高效调试与性能优化全攻略
  • 2026年盘锦大米:揭秘源头厂家背后的秘密与排名!