当前位置: 首页 > article >正文

Spring MVC Controller 方法的返回类型有哪些?

Spring MVC Controller 方法的返回类型非常灵活,可以根据不同的需求返回多种类型的值。Spring MVC 会根据返回值的类型和相关的注解来决定如何处理响应。

以下是一些常见的 Controller 方法返回类型:

  1. String:

    • 最常见的类型之一,用于返回逻辑视图名 (Logical View Name)。 Spring MVC 会使用配置的 ViewResolver 根据这个逻辑视图名找到对应的物理视图(例如 JSP 文件、Thymeleaf 模板等),并渲染响应。
    • 特殊用法: 如果返回的 String"redirect:" 开头,Spring MVC 会执行一个客户端重定向到指定的 URL。
    • 特殊用法: 如果返回的 String"forward:" 开头,Spring MVC 会执行一个服务器端转发到指定的 URL 或另一个 Controller 方法。
    @GetMapping("/show")
    public String showPage() {return "myPage"; // 返回逻辑视图名 "myPage"
    }@PostMapping("/save")
    public String saveData() {// ... save data ...return "redirect:/success"; // 重定向到 /success
    }@GetMapping("/process")
    public String processRequest() {// ... process ...return "forward:/internal/handler"; // 转发到 /internal/handler
    }
    
  2. void:

    • 当 Controller 方法返回 void 时,意味着该方法直接处理了响应(例如通过 Servlet API 获取 HttpServletResponse 并写入数据),或者 Spring MVC 会根据请求的 URL 自动推断视图名(这种方式较少使用,且依赖于特定的配置)。
    • 更常见的是结合 @ResponseBody 使用 void,表示不需要返回响应体,或者响应体已经在方法内部通过其他方式写入(例如流式写入)。
    @PostMapping("/noContent")
    @ResponseBody // 表示不需要视图,但也没有响应体
    public void doNothing() {// 完成一些操作,但不需要返回数据或视图
    }// 或者直接操作 response
    @GetMapping("/directWrite")
    public void writeResponse(HttpServletResponse response) throws IOException {response.setContentType("text/plain");response.getWriter().write("Directly written!");
    }
    
  3. Object (any POJO or collection) with @ResponseBody:

    • 当方法返回一个普通的 Java 对象(POJO)、集合或基本数据类型,并且方法或类上使用了 @ResponseBody 注解时,Spring MVC 会跳过视图解析阶段。
    • 它会使用配置的 HttpMessageConverter 将返回的对象序列化成特定的格式(如 JSON、XML)写入到 HTTP 响应体中。这种方式是构建 RESTful API 的主要方式。
    • @RestController 注解本质上是 @Controller@ResponseBody 的组合,用在类级别时,该类下所有方法默认都会将返回值序列化为响应体。
    @GetMapping("/api/user")
    @ResponseBody
    public User getUser() {// ... retrieve user ...return new User("Alice", 30); // 返回 User 对象,会被序列化为 JSON/XML 等
    }@RestController // 整个类的方法默认都带 @ResponseBody
    @RequestMapping("/api")
    public class UserRestController {@GetMapping("/list")public List<User> getAllUsers() {// ... retrieve list ...return Arrays.asList(new User("Alice", 30), new User("Bob", 25));}
    }
    
  4. ResponseEntity<?>:

    • 这是 Spring MVC 提供的用于完全控制 HTTP 响应的类型。它允许设置响应的状态码 (Status Code)、HTTP 头 (Headers) 和响应体 (Body)。
    • 适合构建 RESTful API,可以方便的返回 200 OK, 201 Created, 404 Not Found 等不同的状态码,并包含响应体。
    @GetMapping("/api/users/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {User user = findUser(id);if (user != null) {return ResponseEntity.ok(user); // 返回 200 OK 和用户对象} else {return ResponseEntity.notFound().build(); // 返回 404 Not Found}
    }@PostMapping("/api/users")
    public ResponseEntity<User> createUser(@RequestBody User newUser) {User savedUser = saveUser(newUser);return ResponseEntity.status(HttpStatus.CREATED).body(savedUser); // 返回 201 Created 和创建的用户对象
    }
    
  5. ModelAndView:

    • Spring MVC 早期常用的类型,它将模型数据 (Model Data) 和视图名 (View Name) 封装在一起返回。
    • 虽然功能强大,但相对于返回 String@ResponseBody + Object 而言,代码略显繁琐,但在某些场景下(例如需要在返回视图的同时设置特定的模型数据)仍然有用。
    @GetMapping("/details")
    public ModelAndView showDetails(@RequestParam Long id) {User user = findUser(id);ModelAndView mav = new ModelAndView("userDetails"); // 设置视图名mav.addObject("user", user); // 添加模型数据return mav;
    }
    
  6. View:

    • 可以直接返回一个 View 接口的实现类实例,而不是逻辑视图名。这允许你编程方式地选择或创建一个视图。
    @GetMapping("/customView")
    public View customView() {return new MyCustomView(); // 返回一个自定义的 View 实现
    }
    
  7. 异步支持的类型:

    • Spring MVC 提供了对异步请求处理的支持,可以在 Controller 方法中返回代表未来结果的对象,从而释放容器线程。
    • Callable<?>: 将耗时操作封装在 Callable 中,Spring 会在一个单独的线程中执行它。
    • DeferredResult<?>: 允许在一个完全独立的线程或服务中返回结果,然后通过 DeferredResult.setResult() 来完成请求。
    • ListenableFuture<?> (Spring 4.x+), CompletionStage<?> / CompletableFuture<?> (Spring 5.x+): 支持与异步框架(如 CompletableFuture)集成。
    @GetMapping("/async/callable")
    public Callable<String> asyncCallable() {return () -> {Thread.sleep(2000); // 模拟耗时操作return "asyncResult"; // 返回逻辑视图名};
    }@GetMapping("/async/deferred")
    public DeferredResult<ResponseEntity<?>> asyncDeferred() {DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>();// 在另一个线程或事件中处理并设置结果// someExternalService.process(data -> deferredResult.setResult(ResponseEntity.ok(data)));return deferredResult;
    }
    
  8. 资源相关类型:

    • 用于直接返回文件或流资源。
    • Resource / InputStreamResource / ByteArrayResource: 用于文件下载或提供静态资源。
    • StreamingResponseBody: 用于需要流式写入响应体,特别是当响应体非常大或需要动态生成时。
    @GetMapping("/download")
    public ResponseEntity<Resource> downloadFile() throws IOException {Path file = Paths.get("path/to/your/file.txt");Resource resource = new UrlResource(file.toUri());return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"").body(resource);
    }@GetMapping("/stream")
    public StreamingResponseBody streamData() {return outputStream -> {for (int i = 0; i < 1000; i++) {outputStream.write(("Data line " + i + "\n").getBytes());outputStream.flush();Thread.sleep(10);}};
    }
    

总结:

  • 返回 HTML 页面: 使用 String 返回视图名,或 ModelAndView
  • 返回 JSON/XML 数据 (REST API): 使用 @ResponseBody + Object,或 ResponseEntity<?>。推荐 ResponseEntity<?> 因为它能控制响应状态和头部。
  • 重定向: 使用 String (前缀 "redirect:")。
  • 服务器端转发: 使用 String (前缀 "forward:")。
  • 需要完全控制响应 (状态码、头部、体): 使用 ResponseEntity<?>
  • 异步处理请求: 使用 Callable<?>, DeferredResult<?>, CompletableFuture<?> 等。
  • 直接返回文件或流: 使用 Resource 相关类型或 StreamingResponseBody
  • 不需要返回任何内容 (with @ResponseBody): 使用 void

Spring MVC 通过 HandlerMethodReturnValueHandler 机制来处理这些不同的返回类型,为每种类型找到合适的处理器来生成最终的 HTTP 响应。

相关文章:

Spring MVC Controller 方法的返回类型有哪些?

Spring MVC Controller 方法的返回类型非常灵活&#xff0c;可以根据不同的需求返回多种类型的值。Spring MVC 会根据返回值的类型和相关的注解来决定如何处理响应。 以下是一些常见的 Controller 方法返回类型&#xff1a; String: 最常见的类型之一&#xff0c;用于返回逻辑…...

Redis 主从同步与对象模型(四)

目录 1.淘汰策略 1.1 expire/pexpire&#xff08;设置键的过期时间&#xff09; 1.2 配置 1.maxmemory 2.maxmemory-policy 3.maxmemory-samples 2.持久化 2.1背景 2.2 fork 的写时复制机制 2.3 大 key 3.持久化方式 3.1 aof&#xff08;Apped Only File&#xff09…...

Linux系列:如何用perf跟踪.NET程序的mmap泄露

一&#xff1a;背景 1. 讲故事 如何跟踪.NET程序的mmap泄露&#xff0c;这个问题困扰了我差不多一年的时间&#xff0c;即使在官方的github库中也找不到切实可行的方案&#xff0c;更多海外大佬只是推荐valgrind这款工具&#xff0c;但这款工具底层原理是利用模拟器&#xff…...

如何租用服务器并通过ssh连接远程服务器终端

这里我使用的是智算云扉 没有打广告 但确实很便宜 还有二十小时免费额度 链接如下 注册之后 租用新实例 选择操作系统 选择显卡型号 点击租用 选择计费方式 选择镜像 如果跑深度学习的话 就选项目对应的torch版本 没有的话 就创建纯净的cuda 自己安装 点击创建实例 创建之后 …...

Git的核心作用详解

一、版本控制与历史追溯 Git作为分布式版本控制系统&#xff0c;其核心作用是记录代码的每一次修改&#xff0c;形成完整的历史记录。通过快照机制&#xff0c;Git会保存每次提交时所有文件的完整状态&#xff08;而非仅记录差异&#xff09;&#xff0c;确保开发者可以随时回…...

华为设备链路聚合实验:网络工程实战指南

链路聚合就像为网络搭建 “并行高速路”&#xff0c;既能扩容带宽&#xff0c;又能保障链路冗余&#xff0c;超实用&#xff01; 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2&#xff0c;PC1、PC2 归属 VLAN 10&#xff0c;PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…...

AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue

AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR&#xff08;AUTomotive Open Sy…...

linux基础操作4------(权限管理)

一.前言 今天我们来讲讲linux的权限管理&#xff0c;比如文件的权限&#xff0c;如果大家看过前面说的app逆向的frida&#xff0c;我们在手机里要给frida&#xff0c;我们都要设置一下chomd 777 frida &#xff0c;这样就给了可执行权限&#xff0c;这就是这一章要讲的&#x…...

双系统电脑中如何把ubuntu装进外接移动固态硬盘

电脑&#xff1a;win11 ubuntu22.04 实体机 虚拟机&#xff1a;VMware17 镜像文件&#xff1a;ubuntu-22.04.4-desktop-amd64.iso 或者 ubuntu20.4的镜像 外接固态硬盘1个 一、首先win11中安装vmware17 具体安装方法&#xff0c;网上很多教程 二、磁盘分区 1.在笔…...

Nacos源码—Nacos集群高可用分析(三)

6.CAP原则与Raft协议 (1)CAP分别指的是什么 一.C指的是一致性Consistency 各个集群节点之间的数据&#xff0c;必须要保证一致。 二.A指的是可用性Availability 在分布式架构中&#xff0c;每个请求都能在合理的时间内获得符合预期的响应。 三.P指的是分区容错性Partition To…...

【C语言】程序的预处理,#define详解

一、预定义符号 二、#define 1.#define定义标识符 #define &#xff0b; 自定义名称 &#xff0b; 代替的内容 例&#xff1a; #define MAX 100 #define CASE break;case #define CASE break;caseint main() {int n 0;switch (n){case 1:CASE 2:CASE 3:CASE 4:}return …...

NVM完全指南:安装、配置与最佳实践

发布于 2025年5月7日 • 阅读时间&#xff1a;10分钟 &#x1f4a1; TL;DR: 本文详细介绍了如何完整卸载旧版Node.js&#xff0c;安装NVM&#xff0c;配置阿里云镜像源&#xff0c;以及设置node_global与node_cache目录&#xff0c;打造高效Node.js开发环境。 &#x1f4cb; 目…...

(二)毛子整洁架构(CQRS/Dapper/领域事件处理器/垂直切片)

文章目录 项目地址一、Application 层1.1 定义CQRS的接口以及其他服务1. Command2. IQuery查询3. 当前时间服务接口4. 邮件发送服务接口 1.2 ReserveBooking Command1. 处理传入的参数2. ReserveBookingCommandHandler3. BookingReservedDomainEvent 1.3 Query使用Sql查询1. 创…...

基于大核感知与非膨胀卷积的SPPF改进—融合UniRepLK的YOLOv8目标检测创新架构

在当前目标检测领域中,YOLO系列模型因其优异的速度-精度平衡能力而被广泛部署于工业界与科研场景。YOLOv8作为该系列的最新版本,在主干网络与特征金字塔结构上进行了多项优化,进一步提升了其实时性与鲁棒性。然而,其核心组件—SPPF(Spatial Pyramid Pooling Fast)模块仍采用…...

基于SpringBoot网上书店的设计与实现

pom.xml配置文件 1. 项目基本信息(没什么作用) <groupId>com.spring</groupId> <!--项目组织标识&#xff0c;通常对应包结构--> <artifactId>boot</artifactId> <!--项目唯一标识--> <version>0.0.1-SNAPSHOT</ve…...

小程序多线程实战

在小程序开发中&#xff0c;由于微信小程序的运行环境限制&#xff0c;原生并不支持传统意义上的多线程编程&#xff0c;但可以通过以下两种核心方案实现类似多线程的并发处理效果&#xff0c;尤其在处理复杂计算、避免主线程阻塞时非常关键&#xff1a; 一、官方方案&#xff…...

如何修改MySQL数据库密码

文章目录 一、忘记数据库密码该如何修改1. 关闭数据库的服务2.跳过安全检查3. 重置密码4.查询用户是否存在5.退出验证密码是否正确 二、未忘记密码该如何修改密码1.直接修改密码2.登录mysql 时间久了&#xff0c;忘记数据库密码了。。。。。 一、忘记数据库密码该如何修改 1. …...

【Python】mat npy npz 文件格式

1、简介 MAT 文件和 NP&#xff08;.npy 或 .npz&#xff09;文件是两种不同的格式&#xff0c;用于存储数组数据。它们分别由 MATLAB 和 NumPy 开发&#xff0c;主要用于各自环境中的数据存储和交换。以下是这两种格式的主要区别&#xff1a; 1.1 格式和用途 MAT 文件&…...

SpringBoot快速入门WebSocket(​​JSR-356附Demo源码)

现在我想写一篇Java快速入门WebSocket,就使用 JSR-356的websocket,我想分以下几点, 1. websocket介绍, 1.1 介绍 什么是WebSocket&#xff1f;​​ WebSocket 是一种基于 ​​TCP​​ 的​​全双工通信协议​​&#xff0c;允许客户端和服务器在​​单个长连接​​上实…...

JDBC执行sql过程

1. 加载数据库驱动​ JDBC 通过 ​​驱动&#xff08;Driver&#xff09;​​ 实现与不同数据库的通信。驱动需提前加载到 JVM&#xff1a; 手动加载&#xff08;JDBC 4.0 前&#xff09;​​&#xff1a; Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 驱…...

VNC windows连接ubuntu桌面

✅ 步骤 1&#xff1a;安装 VNC 服务器 首先&#xff0c;我们需要在 Winux 系统上安装一个 VNC 服务器。这里我们使用 tigervnc 作为例子&#xff0c;它是一个常用的 VNC 服务器软件。 打开终端并更新你的软件包&#xff1a; sudo apt update安装 tigervnc 服务器&#xff1a;…...

CSS中的@import指令

一、什么是import指令&#xff1f; import 是CSS提供的一种引入外部样式表的方式&#xff0c;允许开发者在CSS文件中引入其他CSS文件&#xff0c;或者在HTML的<style>标签中引入外部样式。与常见的<link>标签相比&#xff0c;import 提供了一种更“CSS原生”的样式…...

【安装配置教程】ubuntu安装配置Kodbox

目录 一、引言 二、环境配置 1. 服务器配置​ 2. 必备组件​ 三、安装基础环境​ 1. 安装 PHP 8.1 及扩展​ 2. 安装 MySQL 数据库 3.安装 Redis&#xff08;可选&#xff0c;提升缓存性能&#xff09; 4. 配置nginx文件 4.1. 创建 Kodbox 站点目录​ 4.2. 编写 Ng…...

【软件设计师:数据库】13.数据库控制与安全

一、数据库语言SQL SQL是结构化查询语言(Structured Query Language)的缩写,其功能包括数据查询、数据操纵、数据定义和数据控制四个部分。 SQL 语言简洁、方便实用、功能齐全,已成为目前应用最广的关系数据库语言。SQL既是自含式语言(联机交互),又是嵌入式语言(宿主语…...

LabVIEW车牌自动识别系统

在智能交通快速发展的时代&#xff0c;车牌自动识别系统成为提升交通管理效率的关键技术。本案例详细介绍了基于 LabVIEW 平台&#xff0c;搭配大恒品牌相机构建的车牌自动识别系统&#xff0c;该系统在多个场景中发挥着重要作用&#xff0c;为交通管理提供了高效、精准的解决方…...

el-menu 折叠后小箭头不会消失

官方示例 <template><el-radio-group v-model"isCollapse" style"margin-bottom: 20px"><el-radio-button :value"false">expand</el-radio-button><el-radio-button :value"true">collapse</el-ra…...

c语言第一个小游戏:贪吃蛇小游戏01

hello啊大家好 今天我们用一个小游戏来增强我们的c语言&#xff01; 那就是贪吃蛇 为什么要做一个贪吃蛇小游戏呢&#xff1f; 因为这个小游戏所涉及到的知识有c语言的指针、数组、链表、函数等等可以让我们通过这个游戏来巩固c语言&#xff0c;进一步认识c语言。 一.我们先…...

6. HTML 锚点链接与页面导航

在开发长页面或文档类网站时,锚点链接(Anchor Links)是一个非常实用的功能。通过学习 HTML 锚点技术,将会掌握如何在同一页面内实现快速跳转,以及如何优化长页面的导航体验。以下是基于给定素材的学习总结和实践心得 一、什么是锚点链接? 锚点链接(也称为页面内链接)允…...

[项目总结] 抽奖系统项目技术应用总结

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

Axios替代品Alova

介绍alova | Alova.JS Multipart 实体请求 | Axios中文文档 | Axios中文网 1. 极致的轻量与性能 Tree-shaking优化&#xff1a;仅打包使用到的功能模块 零依赖&#xff1a;基础包仅 4KB&#xff08;Axios 12KB&#xff09; 2. 智能请求管理&#xff08;开箱即用&#xff0…...