首页 > 其他分享 >@RestController如何理解

@RestController如何理解

时间:2024-06-24 10:43:33浏览次数:18  
标签:返回 RestController ResponseBody 视图 如何 Controller 理解 注解

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

目录

什么是@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 页面。
再以实例说明,更通俗易懂的理解:
需要返回视图的实例: 假设你正在开发一个博客应用的后端接口。有一个页面需要显示所有文章的列表,并且希望以 HTML 形式展示。在这种情况下,你可以设计一个 GET 请求的接口 /api/articles,返回一个包含所有文章数据的视图,让前端直接展示这个页面。这里需要返回视图而不是仅返回数据,因为需要服务端渲染整个 HTML 页面。

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/miles067/article/details/132567377

标签:返回,RestController,ResponseBody,视图,如何,Controller,理解,注解
From: https://www.cnblogs.com/AZM1012/p/18264536

相关文章

  • 如何避免 `click` 和 `mousedown` 事件之间的冲突
    Genie你好!为了避免click和mousedown事件之间的冲突,可以通过检查拖拽的状态来决定是否应触发click事件。我们可以设置一个简单的延迟,并使用一个标志位来确定是否应该忽略click事件。下面是修改后的代码:<script>const{remote,ipcRenderer}=require('electron'......
  • 一键掌控,智慧升级:度假酒店可视化管理解决方案全解析
    在繁忙的都市生活中,度假酒店成了许多人逃离喧嚣、寻找宁静的首选之地。然而,随着旅游业的蓬勃发展,度假酒店面临的挑战也日益增多。如何提升服务质量、确保客人满意度、优化运营效率,成为了摆在各大度假酒店面前的难题。 传统的酒店管理模式往往依赖于人工巡查、纸质记录等方式,不......
  • yolov8训练过程中,出现IndexError:index 17 is out of bounds for dimension 1 with siz
     在用yolov8做数据训练自己的数据时发现,这样一个错误,困扰了我很久。报错的原因是数组的问题,我查了一下百度,说是定义数组的问题,之后我就慌的一批,这个源包这么多,该去哪排查。raceback(mostrecentcalllast):File"d:\jiaotong\ultralytics-8.1.0\mytrain.py",line10,......
  • 如何利用窗口函数实现精确排名计算?
    前言SQL语句中,聚合函数在统计业务数据结果时起到了重要作用,比如计算每个业务地区的业务总数、每个班级的学生平均分以及每个分类的最大值等。然而,今天小编将为大家介绍窗口函数,与聚合函数相比,它们也是一组函数,但在使用方法和适用场景上有所不同。在本章节中,我将重点介绍窗口函数......
  • 内卷时代!程序员如何突破35岁的宿命?
    大家好,我是码农先森。曾经梦想仗剑走天涯,如今却在写字楼里安家。他乡容不下灵魂,家乡容不下肉体,还面临着35岁被毕业,这难道就是程序员的宿命?大环境我们无法改变,但我认为至少能改变自己。我想从技术、业务、管理这三方面来阐述自己的观点,希望对大家能有所启发。技术不知大家在公司......
  • 【Gradio】Chatbot | 如何使用 Gradio Blocks 创建自定义聊天机器人
    简介重要提示:如果您刚开始接触,我们建议使用 gr.ChatInterface 来创建聊天机器人——它是一个高级抽象,使得可以快速创建漂亮的聊天机器人应用程序,往往只需一行代码。在这里了解更多信息。本教程将展示如何使用Gradio的低级BlocksAPI从头开始制作聊天机器人UI。这将使......
  • 在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
    在Linux中统计IP访问情况并分析Nginx访问日志,以找出访问页面数量在前十位的IP地址,可以通过一系列命令行工具高效完成。这里以一个典型的工作流程为例,说明如何进行这一分析:1.确定日志文件位置首先,需要知道Nginx的访问日志文件位置。通常,这个文件位于/var/log/nginx/access.log,但......
  • 在Linux中,如何实时抓取并显示当前系统中tcp 80 端口的网络数据信息?
    在Linux中,实时抓取并显示当前系统中TCP80端口的网络数据信息,可以使用tcpdump这个强大的命令行工具。以下是详细的步骤和命令:打开终端:首先,打开一个具有足够权限的终端窗口。通常,需要使用sudo或以root身份执行tcpdump,因为它需要访问底层网络接口。确定网络接口:使用ifconfig(在......
  • 在Linux中,如何将本地 80 端口的请求转发到 8080 端口?当前主机 IP 为10.0.0.104。
    在Linux系统中,将本地80端口的请求转发到8080端口,可以通过使用iptables命令来实现。当前主机IP为10.0.0.104,具体命令如下:iptables-tnat-APREROUTING-d10.0.0.104-ptcp--dport80-jDNAT--to-destination10.0.0.104:8080解析:iptables:iptables命令用于配置Linux内核......
  • 在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结
    在Linux中,要使用tcpdump监听目标为主机IP为192.168.1.1,且TCP端口为80的数据包,并将输出结果保存到名为tcpdump.log的文件中,可以按照以下步骤操作:打开终端:首先,你需要在具有足够权限的用户账户下打开一个终端窗口。通常,root权限是必要的,因为普通用户可能无法监听网络接口的所有流......