Spring MVC 如何定义一个 Controller? @Controller 和 @RestController 注解有什么区别?

java注解:@Controller 与 @RestController 本文深入解析Spring框架中的@Controller和@RestController注解。@Controller主要用于传统Web开发,处理请求后返回视图(如HTML页面),需配合@ResponseBody才能返回数据;而@RestController是@Controller和@ResponseBody的组合,专为RESTful API设计,自动将返回值转换为JSON/XML等格式。文章通过代码示例对比两者的使用差异,并指出适用场景:@Controller适合页面渲染和混合应用 阅读详情

我们来详细解释一下如何在 Spring MVC 中定义 Controller,以及 @Controller 和 @RestController 的区别和使用场景。

如何定义一个 Controller?

在 Spring MVC 中,Controller 扮演着 MVC 模式中 “C” 的角色。它负责接收来自客户端(通常是浏览器或 API 消费者)的 HTTP 请求,处理这些请求(可能需要调用 Service 层进行业务逻辑处理),并最终决定返回什么响应给客户端。

定义一个 Controller 非常简单,主要包含以下步骤:

  1. 创建一个 Java 类:这只是一个普通的 Java 类。
  2. 使用 @Controller 或 @RestController 注解:在这个类上添加 @Controller 或 @RestController 注解。这会告诉 Spring IoC 容器,这个类是一个 Spring MVC Controller 组件,需要被扫描和管理。
  3. 定义处理请求的方法(Handler Methods):在 Controller 类中创建公共方法(public methods)。
  4. 使用映射注解:在这些方法上使用 @RequestMapping 或其更具体的变体(如 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping)来指定这个方法处理哪些 URL 路径和 HTTP 方法的请求。
  5. 处理请求和返回响应:方法内部可以包含处理请求的逻辑,例如读取请求参数、路径变量、请求体,调用服务层,并最终返回一个响应。这个响应可以是一个视图名称(由视图解析器处理)、一个包含模型数据的对象(自动序列化为 JSON/XML),或者一个 ResponseEntity 对象来更精细地控制响应状态码和头信息。

基本示例 (@Controller):

package com.example.mywebapp.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller // 标记此类为 Spring MVC Controller
public class GreetingController {

    // 处理对 "/greeting" 路径的 GET 请求
    @GetMapping("/greeting")
    public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
        // 将数据添加到 Model 中,使其在视图中可用
        model.addAttribute("nameAttribute", name);
        // 返回视图的逻辑名称 ("greeting")
        // Spring MVC 会查找名为 "greeting" 的视图(例如 greeting.html 或 greeting.jsp)来渲染
        return "greeting";
    }
}

@Controller 和 @RestController 的区别

这两个注解都用于标记一个类为 Spring MVC Controller,但它们在处理方法返回值方面有关键的区别:

  1. @Controller:

    • 用途: 主要用于传统的 Spring MVC 应用,其目标是返回一个视图(View),通常是 HTML 页面,由服务器端渲染(如使用 Thymeleaf, JSP, FreeMarker 等模板引擎)。
    • 返回值处理:
      • 默认情况下,@Controller 中方法返回的 String 会被 Spring MVC 的 ViewResolver 解释为逻辑视图名称。Spring 会根据配置的视图解析器去查找并渲染对应的视图模板。
      • 如果想让 @Controller 中的某个方法直接返回数据(如 JSON 或 XML)而不是视图名称,需要在该方法上显式添加 @ResponseBody 注解。@ResponseBody 告诉 Spring 将方法的返回值直接写入 HTTP 响应体中,而不是将其解释为视图名称。Spring 会使用配置的消息转换器(Message Converters,如 Jackson)来序列化返回值。
  2. @RestController:

    • 用途: 主要用于构建 RESTful Web Services(API),这些服务通常返回数据(如 JSON 或 XML)给客户端(如前端 JavaScript 框架、移动应用或其他后端服务),而不是渲染 HTML 视图。
    • 返回值处理: @RestController 是一个组合注解,它本身包含了 @Controller 和 @ResponseBody。
      • 这意味着,在一个用 @RestController 注解的类中,所有的处理方法(handler methods)默认都带有 @ResponseBody 的行为。
      • 方法的返回值会被自动序列化(通常为 JSON,如果类路径下有 Jackson 库)并写入 HTTP 响应体。你不需要在每个方法上单独添加 @ResponseBody 注解。

总结表格:

特性@Controller@RestController (@Controller + @ResponseBody)
主要用途传统 Web 应用,返回视图 (HTML)构建 RESTful API,返回数据 (JSON/XML)
默认返回值处理解释为视图名称,由 ViewResolver 处理直接写入响应体,由 HttpMessageConverter 序列化
返回数据需加需要在方法上加 @ResponseBody不需要,已默认包含 @ResponseBody 行为
组合注解否是 (@Controller + @ResponseBody)

使用场景?

选择哪个注解取决于你的 Controller 的主要目的:

  • 使用 @Controller :

    • 正在构建一个传统的、服务器端渲染的 Web 应用程序。
    • Controller 主要负责返回需要由模板引擎(如 Thymeleaf, JSP)渲染的视图名称。
    • Controller 中只有少数方法需要直接返回数据(这时可以在这些特定方法上使用 @ResponseBody)。
  • 使用 @RestController :

    • 构建一个 RESTful API,目的是为客户端(如单页应用、移动应用、其他微服务)提供数据。
    • Controller 中所有或绝大多数方法都需要直接返回数据(通常是 JSON 或 XML)而不是视图。
    • 简化代码,避免在每个方法上都写 @ResponseBody。

示例 (@RestController):

package com.example.myapi.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.example.myapi.model.User; // 假设有一个 User Pojo

@RestController // 标记此类为 REST Controller,所有方法默认返回数据
public class UserController {

    // 处理对 "/api/users/{id}" 路径的 GET 请求
    @GetMapping("/api/users/{id}")
    public User getUserById(@PathVariable Long id) {
        // 假设 userService.findById(id) 返回一个 User 对象
        // User userService = ...;
        // User user = userService.findById(id);

        // 模拟返回一个 User 对象
        User user = new User(id, "John Doe", "john.doe@example.com");

        // 这个 User 对象会被自动序列化为 JSON 并写入响应体
        return user;
    }

    // 处理对 "/api/status" 路径的 GET 请求
    @GetMapping("/api/status")
    public String getStatus() {
        // 即使返回 String,也会被直接写入响应体,而不是作为视图名
        return "API is running";
    }
}

在这个 @RestController 示例中,getUserById 方法返回的 User 对象会被 Spring 自动转换为 JSON 格式的响应体。getStatus 方法返回的字符串 "API is running" 也会被直接作为纯文本写入响应体,而不是被视图解析器处理。

开发中根据我们的应用类型(返回 HTML 视图还是返回 API 数据)来选择合适的注解。

@RestController和@Controller的区别 而@Controller适用于构建传统的Web应用,返回HTML页面。返回类型: @RestController注解的类返回的是数据,一般用于构建RESTful风格的API接口,返回的数据通常是JSON格式;而@Controller注解的类返回的是视图,一般用于构建传统的Web应用,返回的是HTML页面。注解组合: @RestController注解相当于@Controller和@ResponseBody的结合体,省去了在@Controller中使用@ResponseBody的步骤,使代码更为简洁。 阅读详情

相关推荐

Rust 与 C/C++:Rust 比 C/C++ 更好还是只是“技能问题”?

对于许多嵌入式系统开发人员而言,的崛起似乎掀起了一股不小的浪潮,特别是在相较于传统的语言,Rust的“内存安全”优势让人眼前一亮。然而,是否可以将Rust作为C/C++的替代品?或者说,Rust是否真的比C/C++更好,抑或它只是一个“技能问题”呢?在嵌入式开发的领域,我观察到,尽管Rust在一些高性能、内存安全敏感的场景中受到了广泛推崇,但它在实际应用中的普及度,特别是在嵌入式领域,依然有限。今天,我会从多个角度探讨这个问题,并且分享一些对于Rust、C/C++以及嵌入式系统开发的个人见解。

qq_63315166的博客 1300

java 注解 controller_详解SpringMVC Controller介绍及常用注解

一、简介在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Co...

weixin_30183847的博客 1408

10xGenomics官方可视化工具——Loupe Browser

Loupe Browser是⼀款10xGenomics开发的交互式桌⾯应⽤程序,⽤于探索10x单细胞数据,可以用来找出感兴趣的细胞、找出显著差异表达的基因、鉴定细胞类型、探索细胞亚类和数据共享。

weixin_47195452的博客 3356

Spring Boot 中的 @Controller 注解:原理、用法与示例

Contoller 注解是 Spring Boot 中常用的注解之一,它可以将一个 Java 类标记为 Spring MVC 中的控制器。控制器负责接收请求、处理请求,并返回响应。本文介绍了 @Controller 注解的原理、用法和示例,希望可以帮助读者更好地理解和使用这个注解。

程序员徐师兄的博客 1万+

【Origin+Python】使用External Python批量出图代码参考2

不使用part2 的代码,自己打开一个origin2022的界面。这里主要介绍一些进阶代码以及使用盗版origin要如何。3 批量绘制相同设置的曲线图。然后就是没有水印的图片了。

zeng001201的博客 1908

Fritzing0.9.10下载安装和简单使用

Fritzing 作为一款电子设计自动化软件,其画图用于导入到论文和文档,清晰好看,能解决用相机拍实物照片杜邦线很乱的痛点。

李同学Lino的博客 3万+

@Controller注解

@Controller 是Spring框架提供的注解。 @Controller标识的类,该类代表控制器类(控制层/表现层)。 这里控制层里面的每个方法,都可以去调用@Service标识的类(业务逻辑层), @Service标识的类中的方法可以继续调用@Resposity标识的接口实现类(Dao层/持久层)。 MVC设计模式:M(model)指模型,V(view)指视图层,C(controller)指控制层。 M代表模型一般指service和DAO;view代表视图一般指页面eg:jsp,html ftl等;

qq_46046423的博客 3万+

io_uring vs epoll ,谁在网络编程领域更胜一筹?

简介:从定量分析的角度,通过量化 io_uring 和 epoll 两种编程框架下的相关操作的耗时,来分析二者的性能差异。 本文作者:王小光,「高性能存储技术SIG」核心成员。 背景 io_uring 在传统存储 io 场景已经证明其价值,但 io_uring 不仅支持传统存储 io,也支持网络 io。io_uring 社区有众多的开发者尝试将 io_uring 用于网络应用。我们之前也在《你认为 io_uring 只适用于存储 IO?大错特错!》中也探索过 io_uring 在网络场景的应用及其

阿里云云栖号 3034

每天一个注解之@Controller

Controller 是 Spring Framework 中的注解,用于标识一个类是控制器组件。在 Spring MVC(Model-View-Controller)架构中扮演重要角色,负责处理来自客户端的HTTP请求,协调业务逻辑的处理,并根据请求返回适当的视图或数据。

qq_43406318的博客 1767

PaddleOCR训练自己的数据

一 、数据准备 采用PPOCRLabel标注自己的数据 PPOCRLabel是一款适用于OCR领域的半自动化图形标注工具,内置PP-OCR模型对数据自动标注和重新识别。使用Python3和PyQT5编写,支持矩形框标注和四点标注模式,导出格式可直接用于PaddleOCR检测和识别模型的训练。 1.1 安装PaddlePaddle pip3 install --upgrade pip # 如果您的机器安装的是CUDA9或CUDA10,请运行以下命令安装 python3 -m pip in.

zyb的博客 1万+

基于YOLO26的实时目标追踪实战:从训练到视频追踪(附完整可视化代码)

核心组合:YOLO26(高精度检测)+ ByteTrack(稳定追踪)是实时目标追踪的最优工业组合,Ultralytics内置集成无需额外开发;训练优化:追踪场景需优先提升检测框精度(增加box损失权重),保证ID稳定性;可视化核心:为每个ID分配唯一颜色、绘制运动轨迹、显示FPS,是落地场景的必备功能;性能调优:轻量化模型+降分辨率+OpenVINO导出,可在边缘设备(如研华工控机)实现实时追踪。这套代码可直接复用到智慧园区、停车场、工业产线等场景,仅需修改park.yaml中的类别和。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 571

SpringMVC控制器定义:@Controller注解详解

Controller注解是SpringMVC框架的核心组件之一,它为Java Web开发提供了强大而灵活的控制器定义机制。本文全面剖析了@Controller及其相关注解的使用方法与工作原理,从基础的请求映射到高级的RESTful API开发,从参数绑定与数据校验到全局控制器建议,系统性地展示了SpringMVC控制器的丰富功能。通过合理使用这些注解,开发者可以构建出结构清晰、功能完善的Web应用,有效处理各种复杂的HTTP请求与响应。

程序媛学姐的博客 2114

什么是 AIDV(AI 定义汽车):从软件定义到智能决策的范式革命

AI定义汽车(AIDV),是指以人工智能(尤其是大模型、深度学习、强化学习)为核心引擎,以车载AI芯片为算力底座,以“数据闭环”为迭代支撑,重构汽车感知、决策、执行全链路,实现“感知智能化、决策自主化、体验个性化、迭代自动化”的新一代智能汽车发展范式。其核心是让汽车从“执行工具”升级为“具备自主学习与智能决策能力的移动智能终端”,核心价值是“车与人的深度协同”与“复杂场景的自主适配”。

getusushu的博客 96

Spring 框架极简学习笔记(二)

SpringMVC是Spring框架的Web开发模块,用于简化JavaWeb应用开发。核心功能包括请求接收、业务处理和响应返回,替代传统Servlet开发。采用DispatcherServlet作为前端控制器,配合Controller和ViewResolver实现请求分发与视图解析。提供@Controller、@RestController等注解简化开发,支持RESTful风格接口。

LJJUN66666的博客 337

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

@Controller和@RestController的区别?

https://www.cnblogs.com/shuaifing/p/8119664.html https://www.cnblogs.com/jxwy/p/6797420.html 知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用。 1) 如果只是使用@RestController注解Controller,则...

hery186的专栏 15万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

spring注解:@RestController、@Controller、@ResponseBody

@responseBody @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。  @ResponseBody这个...

lusa1314的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

@Controller和@RestController的区别理解

文章目录项目结构:1.@Controllercontroller层配置试图解析器html层运行结果页面:2.@RestControllercontroller层html层3.@Controller和@ResponseBody配合 @RestController修饰的类会将 return后面的内容字符串的形式返回到@Requestmapping的页面 @Controller修饰的类会将return的字符串配合视图解析器InternalResourceViewResolver添加上前缀和后缀。跳转到对应的ht

weixin_42988712的博客 5538

Spring 中的 @RestController 和 @Controller 的详解和区别

一般用于开发 RESTful 风格的服务接口,如前后端分离的项目中,前端通过 AJAX 或其他 Http 客户端调用后端接口,获取 JSON 或 XML 数据。,我们可以实现处理 HTTP 请求并直接返回 JSON、XML 或其他格式的数据,而不是返回视图页面。提供的一个用来开发 RESTful Web 服务的关键注解,它是。配合使用,设置 RESTful API 的基础路径。默认将返回值序列化为 JSON 格式(如果依赖的。是 Spring 4.0 引入的,属于。用于指定类或方法的请求路径。

HinINAX的博客 3241

Java面试-@Controller 与 @RestController 的区别

《Java面试200问》系列之@Controller与@RestController区别解析 摘要:本文深入解析Spring MVC中两个核心注解的区别。@Controller是传统MVC控制器,默认返回视图名,需配合@ResponseBody才能返回数据;而@RestController(= @Controller + @ResponseBody)专为REST API设计,自动将方法返回值序列化为JSON/XML。文章通过实际案例演示常见错误场景,并剖析源码实现差异,帮助开发者正确选用注解类型。适用于准备

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

@RestController注解和@Controller注解的区别

控制器类的注解

wuzengwen18914044177的博客 6651

java controller注解原理_@Controller、@RestController注解区别详解

@Controller、@RestController注解区别:@RestController 注解相当于 @Controller + @ResponseBody 合在一起的作用。一、@Controller注解@Controller 是Spring框架提供的注解。@Controller标识的类,该类代表控制器类(控制层/表现层)。这里控制层里面的每个方法,都可以去调用@Service标识的类(业务...

weixin_28688791的博客 2529

@RestController和@Controller的区别和使用技巧(Controller层注解详解、@RestController、@Controller、@RequestMapping等)

@RestController和@Controller的区别和使用技巧(Controller层注解详解、@RestController、@Controller、@RequestMapping等) @RestController注解相当于@ResponseBody + @Controller合在一起的作用。 @controller返回(return)的是视图的名字,而@RestController返回的则是return后面的信息(接下来举几个例子) @Controller可以实现返回信息(String)、

qq_48033003的博客 1887

Spring框架中@RestController和@Controller的区别

Spring框架中的@Controller和@RestController注解关键区别在于:@Controller适用于传统MVC架构,返回视图名称由ViewResolver解析为HTML页面;而@RestController(包含@ResponseBody)专为RESTful API设计,直接返回序列化的JSON/XML数据。

big_luck_cat的博客 748

【java】@RestController和@Controller的区别

@RestController和@Controller的区别

qq_42320804的博客 1658

JAVA中注解controller_@Controller、@RestController注解区别详解

这篇文章主要介绍了@Controller、@RestController注解区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧@Controller、@RestController注解区别:@RestController 注解相当于 @Controller + @ResponseBody 合在一起的作用。一、@Contro...

weixin_30336529的博客 958

@Controller和@RestController的区别

一、总结 @RestController注解相当于@ResponseBody + @Controller合在一起的作用 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。 例如:本来应该到success.jsp页面的,则其显示success. 如果需要返回到指定页面,则需要用 @Controller配合视图解析器I

light的博客 1万+
上一篇: 如何保证 Redis 在微服务架构中的高可用性?
下一篇: 如何使用可视化工具分析 JVM 的性能瓶颈?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

冰糖心书房

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

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

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

打赏作者

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

抵扣说明:

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

余额充值