@RestController,@Controller和@ResponseBody的区别和联系

@RestController,@Controller和@ResponseBody的区别和联系

问题描述

在项目中新加了一个模块后,在 Controller 中添加的类中使用了@Controller,在测试接口的时候,检查了半天发现路径都是对的,后来又检查本地端口号,代码中是否有拦截器什么的,但是还是报错 404

网上查了需要添加 @RequestBody,我再去检查了一直之前的代码,发现原来是没有添加@RestController,使得一直在找 return 到的页面,因此持续报错

知识总结

非常好记: @RestController= @Controller+ @RequestBody

  • @ResponseBodyresponseBody 通常指的是在HTTP 请求响应中,服务器返回给客户端的数据主体部分。在使用 SpringBoot 框架时,@ResponseBody注解用于标记一个方法的返回值直接写入 HTTP响应体中,而不是作为视图名来渲染页面。
  • @Controller:主要用于 Web 应用,返回视图名称)、ModelAndView 对象或其他类型。以下代码就直接去到了 hello.html页面了
	@Controller
	public class ExampleController {
	
	    @GetMapping("/hello")
	    public String hello(Model model) {
	        model.addAttribute("message", "Hello, World!");
	        return "hello"; // 视图名称
	    }
	}
  • @RestController:主要用于 RESTful API,返回响应体内容,自动序列化为 JSON 或 XML。以下代码就是返回对应响应体
@RestController
public class ExampleController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!"; // 直接写入响应体
    }

    @GetMapping("/user")
    public User getUser() {
        User user = new User("Alice", 30);
        return user; // 自动序列化为 JSON 并写入响应体
    }
}

实际开发的项目中,基本上都是前后端分离。除了启动类为@Controller,其他都为@RestController

`@ResponseBody`, `@RestController`, 和 `@Controller` 都是在Spring框架中用于处理HTTP请求并返回响应结果的注解,它们之间的主要区别在于如何管理返回数据的方式。 ### @ResponseBody `@ResponseBody`是一个用于标注类或方法的注解,表示这个类或方法将返回值直接作为HTTP响应体发送给客户端,而不会将其放入HTTP状态行后的实体内容部分。通常,当需要从控制器方法中返回JSON、XML或其他非HTML格式的数据时会使用它。这是因为传统的JSP或HTML视图(如通过转发到一个JSP页面)不适合处理非HTML格式的数据。 ### @RestController `@RestController` 是一个组合注解,它同时包含了 `@Controller` 和 `@ResponseBody` 的功能。这意味着它不仅能够处理HTTP请求并将响应发回客户端,而且所有的返回值都将被视为HTTP响应体,无需额外配置。这简化了RESTful服务的创建过程,因为开发者只需关注业务逻辑和返回数据,而不需要考虑视图模板或模型绑定等细节。 ### @Controller `@Controller` 注解主要用于声明控制器类,即负责处理HTTP请求并与业务逻辑交互的类。它的主要作用是映射HTTP请求路径,并调用适当的方法来处理这些请求。`@Controller` 类可以包含多个处理请求的方法,每个方法可以根据需要使用其他注解来指定返回的内容类型、是否接受特定的HTTP方法(GET、POST等),以及处理响应的方式。 --- ## 相关问题: 1. 在什么场景下应该优先选择使用 `@ResponseBody` 还是 `@RestController`? 当你需要直接返回非HTML格式的数据(如JSON、XML)时,通常会选择使用 `@ResponseBody`;而如果项目倾向于RESTful API风格,希望减少对视图的依赖,并且所有返回结果均为非HTML格式,则可以选择 `@RestController` 来简化API开发。 2. `@RestController` 是否意味着它可以完全替代 `@Controller`? 虽然 `@RestController` 提供了更简洁的方式来构建RESTful API,但它并不适用于所有情况。例如,在有大量依赖于复杂UI组件或需要深度集成的前端应用时,使用单独的 `@Controller` 可能更为合适。 3. 使用 `@RestController` 或 `@ResponseBody` 的注意事项有哪些? - 确保所有返回的非HTML格式数据都适合以纯文本形式发送给客户端,避免使用这类注解生成不必要的HTML结构。 - 在设计RESTful API时,考虑到一致性原则,统一使用 `@RestController` 或 `@ResponseBody` 的使用习惯可以帮助保持代码的一致性和易于理解性。 - 对于涉及到视图渲染的情况(如使用JSP、Thymeleaf等模板引擎渲染HTML),应使用 `@Controller` 并配合对应的视图解析器,而不是试图使用 `@ResponseBody` 返回视图字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着猪看大海

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值