首页 > 其他分享 >RestController和Controller的区别和异同

RestController和Controller的区别和异同

时间:2024-08-12 16:48:50浏览次数:12  
标签:返回 RestController 异同 视图 ResponseBody Controller 注解

 

参考文章

【SpringBoot】带你一文彻底搞懂RestController和Controller的关系与区别-CSDN博客
https://blog.csdn.net/miles067/article/details/132567377

 

----------------------------------------------------------------------------------------------------------------------------------------------------

 

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

 

----------------------------------------------------------------------------------------------------------------------------------------------------

什么是@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 则负责提供数据即可,所以对返回视图的要求也就比较少了

标签:返回,RestController,异同,视图,ResponseBody,Controller,注解
From: https://www.cnblogs.com/whoknows1/p/18355290

相关文章

  • c += c 与 c = c + number 的异同
    for(inti=0;i<s.length();i++){char[]chars=s.toCharArray();charc=chars[i];c=c+32;//不合法c+=32;//合法byte[]bytes=s.getBytes();byteaByte=bytes[i];......
  • 过滤器、拦截器、AOP、ControllerAdvcie执行顺序对比
    过滤器、拦截器、AOP、ControllerAdvcie执行顺序对比0.执行顺序过滤器➡拦截器➡AOP➡ControllerAdvice➡Controller没有异常的情况下,执行顺序如下:有异常的情况下,执行顺序如下:tip:当产生异常后,无论是否有ControllerAdvice处理,HandlerInterceptor都不会执行post......
  • 【禁止血压飙升】阿里大佬写的 Controller 太优雅了!
    作者:小塵链接:https://juejin.cn/post/7357172505961578511前言见过几千行代码的controller吗?我见过。见过全是trycatch的controller吗,我见过。见过全是字段校验的controller吗,我见过。见过全是业务代码的controller吗?不好意思,我们公司很多业务写在controller的......
  • PHP Laravel 5.2 HTTP控制器Controller介绍及示例
    在Laravel5.2中,HTTP控制器是用于处理HTTP请求的主要组件。控制器可以封装业务逻辑,并且可以使你的应用程序更加模块化和易于维护。下面我将详细介绍Laravel5.2中HTTP控制器的基本概念,并提供一些示例。创建控制器在Laravel5.2中,你可以使用Artisan命令来生成......
  • Mac开发基础09-NSViewController(一)
    NSViewController简介NSViewController是macOS应用程序中的核心类,用于管理单个视图层次结构。它提供了对视图生命周期、布局管理和内容更新的控制,并与模型数据和其他控制器进行交互,提供了高效的视图控制和管理机制。基础知识点NSViewController继承自NSResponder,它主要用......
  • Mac开发基础10-NSViewController(二)
    1.View-BasedUIUpdatesNSViewController提供了很多优化UI更新的方法。利用这些方法,你可以更有效地管理复杂视图的改变。viewWillLayout该方法在控制器的视图层次结构布局之前调用,可以在此方法中修改子视图的布局。Objective-C-(void)viewWillLayout{[superview......
  • 【禁止血压飙升】阿里大佬写的 Controller 太优雅了!
    作者:小塵链接:https://juejin.cn/post/7357172505961578511前言见过几千行代码的controller吗?我见过。见过全是trycatch的controller吗,我见过。见过全是字段校验的controller吗,我见过。见过全是业务代码的controller吗?不好意思,我们公司很多业务写在controller的......
  • 到底什么是@RestController
    @RestController是Spring框架的一个注解,通常用于标识一个类是RESTful服务的Controller。@RestController经常用来处理HTTP请求,是SpringMVC中用于构建RESTfulWeb服务的注解,是@Controller注解的变体通过@RestController注解,SpringMVC可以识别出这个类是一个控制器这个类里面的方......
  • dao层 和controller
    voidinsertReservation(Reservationreservation);voiddeleteReservation(intreservationId);ReservationselectReservation(intreservationId);List<Reservation>selectAllReservations();voidupdateReservation(Reservationreservation);List<Reservation&......
  • @RestController注解
    1.引言在现代的JavaWeb开发中,Spring框架因其简洁、高效和强大的功能而受到广泛欢迎。SpringMVC是Spring框架的一个重要组成部分,用于构建Web应用程序。@RestController注解是SpringMVC提供的一个关键注解,用于简化RESTfulWeb服务的开发。本文将详细讲解@RestController......