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的步骤,使代码更为简洁。 阅读详情

相关推荐

SAP ABAP BADI_FINS_ACDOC_POSTING_EVENTS 深度应用:KO88工单结算的凭证字段定制与财务数据增强

本文深入探讨了SAP ABAP中BADI_FINS_ACDOC_POSTING_EVENTS在KO88工单结算中的应用,详细解析了如何通过BADI实现财务凭证字段的定制与数据增强。文章提供了从结构扩展到BADI方法实现的完整步骤,包括性能优化建议和实际应用中的测试验证流程,帮助开发人员高效解决企业个性化财务需求。

weixin_26869081的博客 389

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

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

weixin_30183847的博客 1408

创龙 瑞芯微 RK3588 国产工业开发板—Qt交叉编译环境搭建与GPU图形渲染实战

本文详细介绍了在创龙RK3588国产工业开发板上搭建Qt交叉编译环境并利用GPU进行图形渲染的完整实战流程。文章从环境准备入手,讲解了交叉编译工具链的配置,并提供了命令行与Qt Creator两种编译方法。通过部署运行和自启动设置,确保程序在板卡上稳定运行。最后,通过OpenGL案例实战,展示了如何调用RK3588的GPU进行高效图形渲染,释放其图形处理潜力,适用于工业HMI、智能终端等高要求图形界面开发。

weixin_28278377的博客 450

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

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

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

别再只当代码阅读器了!手把手教你用Understand的实体定位器和信息浏览器,5分钟精准定位代码逻辑

本文深入解析Understand代码分析工具的高级功能,重点介绍实体定位器和信息浏览器的实战应用。通过5分钟快速定位代码逻辑的技巧,帮助开发者从代码阅读者升级为逻辑侦探,提升大型代码库的分析效率。文章包含过滤搜索、调用链追踪等实用方法,是掌握Understand核心功能的必备指南。

weixin_28745821的博客 292

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出。而且还不需要license限制。

Alex_886的博客 1975

@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万+

OAI-5G开源通信平台实践(一)-安装 部署及RFsimulator基本测试

OAI (Open Air Interface) 是目前开源5G/4G项目中最完善、最成熟的一个,并且仍然在持续更新。其包含基站、终端及核心网网元的代码,可基于x86\arm+射频卡搭建实际硬件平台,也可在x86平台上对rf\phy等层进行模拟,做各网元协议栈的单独测试验证。本文总结了x86平台下,oai的安装及运行方式。包括NTN分支和主分支的rf simulator、nos1、端到端部署等场景的验证流程,同时总结了验证过程中遇到的问题及解决方法。

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 2963

每天一个注解之@Controller

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

qq_43406318的博客 1767

(数字图像处理MATLAB+Python)第五章图像增强-第一节:图像增强概述和基于灰度级变换的图像增强

图像增强(Image Enhancement):指不考虑图像降质原因,利用各种数学方法和变换手段,增强图像中人们感兴趣部分或提高有用的图像特征的清晰度。从图像质量来看,图像增强提高了图像的可懂度,改善了图像的视觉效果例如在现实场景中,针对那些对比度较差、视觉效果不好的图像,我们就可以利用图像增强改善视觉质量图像增强可分为如下几种基于灰度级变换的图像增强基于直方图修正的图像增强基于照度反射模型的图像增强基于模糊技术的图像增强基于伪彩色处理的图像增强其他图像增强方法分段线性灰度级变换。

快乐江湖的博客 3333

Unity接入抖音小程序侧边栏

Unity接入抖音小程序侧边栏功能实践总结 本文分享了Unity游戏接入抖音小程序侧边栏复访功能的实现过程。针对官方文档不清晰的问题,作者详细介绍了关键实现步骤:通过TT.CheckScene检测侧边栏可用性,利用OnShow事件监听判断用户是否从侧边栏进入,并提供了完整的UI交互代码示例。重点功能包括:检测宿主版本支持、区分侧边栏入口与非侧边栏入口的界面展示、实现跳转侧边栏场景等。文中附有官方文档链接和效果截图,为开发者提供了实用的接入参考方案。

类人_猿的博客 613

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

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

程序媛学姐的博客 2114

Python爬虫实战:链家/贝壳租房数据抓取与可视化分析平台

本文详细介绍了如何使用Python爬虫技术抓取链家/贝壳网站的租房信息,并构建一个完整的数据可视化分析平台。文章涵盖了从数据抓取、数据清洗、数据存储到数据可视化的全流程,使用最新的Python技术栈,包括AsyncIOPandasMongoDB和Pyecharts等库。本系统可作为毕业设计项目,提供了完整的代码实现和架构设计。关键词:Python爬虫、数据抓取、数据可视化、链家、贝壳、租房信息、毕业设计。

2201_76125261的博客 1206

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

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

LJJUN66666的博客 337

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

@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万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

lusa1314的博客 1万+

@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、付费专栏及课程。

余额充值