Spring MVC Controller 方法的返回类型有哪些?
Spring MVC Controller 方法的返回类型非常灵活,可以根据不同的需求返回多种类型的值。Spring MVC 会根据返回值的类型和相关的注解来决定如何处理响应。
以下是一些常见的 Controller 方法返回类型:
-
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 } - 最常见的类型之一,用于返回逻辑视图名 (Logical View Name)。 Spring MVC 会使用配置的
-
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!"); } - 当 Controller 方法返回
-
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));} } - 当方法返回一个普通的 Java 对象(POJO)、集合或基本数据类型,并且方法或类上使用了
-
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 和创建的用户对象 } -
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; } -
View:- 可以直接返回一个
View接口的实现类实例,而不是逻辑视图名。这允许你编程方式地选择或创建一个视图。
@GetMapping("/customView") public View customView() {return new MyCustomView(); // 返回一个自定义的 View 实现 } - 可以直接返回一个
-
异步支持的类型:
- 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; } -
资源相关类型:
- 用于直接返回文件或流资源。
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 方法的返回类型非常灵活,可以根据不同的需求返回多种类型的值。Spring MVC 会根据返回值的类型和相关的注解来决定如何处理响应。 以下是一些常见的 Controller 方法返回类型: String: 最常见的类型之一,用于返回逻辑…...
Redis 主从同步与对象模型(四)
目录 1.淘汰策略 1.1 expire/pexpire(设置键的过期时间) 1.2 配置 1.maxmemory 2.maxmemory-policy 3.maxmemory-samples 2.持久化 2.1背景 2.2 fork 的写时复制机制 2.3 大 key 3.持久化方式 3.1 aof(Apped Only File)…...
Linux系列:如何用perf跟踪.NET程序的mmap泄露
一:背景 1. 讲故事 如何跟踪.NET程序的mmap泄露,这个问题困扰了我差不多一年的时间,即使在官方的github库中也找不到切实可行的方案,更多海外大佬只是推荐valgrind这款工具,但这款工具底层原理是利用模拟器ÿ…...
如何租用服务器并通过ssh连接远程服务器终端
这里我使用的是智算云扉 没有打广告 但确实很便宜 还有二十小时免费额度 链接如下 注册之后 租用新实例 选择操作系统 选择显卡型号 点击租用 选择计费方式 选择镜像 如果跑深度学习的话 就选项目对应的torch版本 没有的话 就创建纯净的cuda 自己安装 点击创建实例 创建之后 …...
Git的核心作用详解
一、版本控制与历史追溯 Git作为分布式版本控制系统,其核心作用是记录代码的每一次修改,形成完整的历史记录。通过快照机制,Git会保存每次提交时所有文件的完整状态(而非仅记录差异),确保开发者可以随时回…...
华为设备链路聚合实验:网络工程实战指南
链路聚合就像为网络搭建 “并行高速路”,既能扩容带宽,又能保障链路冗余,超实用! 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2,PC1、PC2 归属 VLAN 10,PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…...
AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue
AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR(AUTomotive Open Sy…...
linux基础操作4------(权限管理)
一.前言 今天我们来讲讲linux的权限管理,比如文件的权限,如果大家看过前面说的app逆向的frida,我们在手机里要给frida,我们都要设置一下chomd 777 frida ,这样就给了可执行权限,这就是这一章要讲的&#x…...
双系统电脑中如何把ubuntu装进外接移动固态硬盘
电脑:win11 ubuntu22.04 实体机 虚拟机:VMware17 镜像文件:ubuntu-22.04.4-desktop-amd64.iso 或者 ubuntu20.4的镜像 外接固态硬盘1个 一、首先win11中安装vmware17 具体安装方法,网上很多教程 二、磁盘分区 1.在笔…...
Nacos源码—Nacos集群高可用分析(三)
6.CAP原则与Raft协议 (1)CAP分别指的是什么 一.C指的是一致性Consistency 各个集群节点之间的数据,必须要保证一致。 二.A指的是可用性Availability 在分布式架构中,每个请求都能在合理的时间内获得符合预期的响应。 三.P指的是分区容错性Partition To…...
【C语言】程序的预处理,#define详解
一、预定义符号 二、#define 1.#define定义标识符 #define + 自定义名称 + 代替的内容 例: #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日 • 阅读时间:10分钟 💡 TL;DR: 本文详细介绍了如何完整卸载旧版Node.js,安装NVM,配置阿里云镜像源,以及设置node_global与node_cache目录,打造高效Node.js开发环境。 📋 目…...
(二)毛子整洁架构(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> <!--项目组织标识,通常对应包结构--> <artifactId>boot</artifactId> <!--项目唯一标识--> <version>0.0.1-SNAPSHOT</ve…...
小程序多线程实战
在小程序开发中,由于微信小程序的运行环境限制,原生并不支持传统意义上的多线程编程,但可以通过以下两种核心方案实现类似多线程的并发处理效果,尤其在处理复杂计算、避免主线程阻塞时非常关键: 一、官方方案ÿ…...
如何修改MySQL数据库密码
文章目录 一、忘记数据库密码该如何修改1. 关闭数据库的服务2.跳过安全检查3. 重置密码4.查询用户是否存在5.退出验证密码是否正确 二、未忘记密码该如何修改密码1.直接修改密码2.登录mysql 时间久了,忘记数据库密码了。。。。。 一、忘记数据库密码该如何修改 1. …...
【Python】mat npy npz 文件格式
1、简介 MAT 文件和 NP(.npy 或 .npz)文件是两种不同的格式,用于存储数组数据。它们分别由 MATLAB 和 NumPy 开发,主要用于各自环境中的数据存储和交换。以下是这两种格式的主要区别: 1.1 格式和用途 MAT 文件&…...
SpringBoot快速入门WebSocket(JSR-356附Demo源码)
现在我想写一篇Java快速入门WebSocket,就使用 JSR-356的websocket,我想分以下几点, 1. websocket介绍, 1.1 介绍 什么是WebSocket? WebSocket 是一种基于 TCP 的全双工通信协议,允许客户端和服务器在单个长连接上实…...
JDBC执行sql过程
1. 加载数据库驱动 JDBC 通过 驱动(Driver) 实现与不同数据库的通信。驱动需提前加载到 JVM: 手动加载(JDBC 4.0 前): Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 驱…...
VNC windows连接ubuntu桌面
✅ 步骤 1:安装 VNC 服务器 首先,我们需要在 Winux 系统上安装一个 VNC 服务器。这里我们使用 tigervnc 作为例子,它是一个常用的 VNC 服务器软件。 打开终端并更新你的软件包: sudo apt update安装 tigervnc 服务器:…...
CSS中的@import指令
一、什么是import指令? import 是CSS提供的一种引入外部样式表的方式,允许开发者在CSS文件中引入其他CSS文件,或者在HTML的<style>标签中引入外部样式。与常见的<link>标签相比,import 提供了一种更“CSS原生”的样式…...
【安装配置教程】ubuntu安装配置Kodbox
目录 一、引言 二、环境配置 1. 服务器配置 2. 必备组件 三、安装基础环境 1. 安装 PHP 8.1 及扩展 2. 安装 MySQL 数据库 3.安装 Redis(可选,提升缓存性能) 4. 配置nginx文件 4.1. 创建 Kodbox 站点目录 4.2. 编写 Ng…...
【软件设计师:数据库】13.数据库控制与安全
一、数据库语言SQL SQL是结构化查询语言(Structured Query Language)的缩写,其功能包括数据查询、数据操纵、数据定义和数据控制四个部分。 SQL 语言简洁、方便实用、功能齐全,已成为目前应用最广的关系数据库语言。SQL既是自含式语言(联机交互),又是嵌入式语言(宿主语…...
LabVIEW车牌自动识别系统
在智能交通快速发展的时代,车牌自动识别系统成为提升交通管理效率的关键技术。本案例详细介绍了基于 LabVIEW 平台,搭配大恒品牌相机构建的车牌自动识别系统,该系统在多个场景中发挥着重要作用,为交通管理提供了高效、精准的解决方…...
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语言! 那就是贪吃蛇 为什么要做一个贪吃蛇小游戏呢? 因为这个小游戏所涉及到的知识有c语言的指针、数组、链表、函数等等可以让我们通过这个游戏来巩固c语言,进一步认识c语言。 一.我们先…...
6. HTML 锚点链接与页面导航
在开发长页面或文档类网站时,锚点链接(Anchor Links)是一个非常实用的功能。通过学习 HTML 锚点技术,将会掌握如何在同一页面内实现快速跳转,以及如何优化长页面的导航体验。以下是基于给定素材的学习总结和实践心得 一、什么是锚点链接? 锚点链接(也称为页面内链接)允…...
[项目总结] 抽奖系统项目技术应用总结
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
Axios替代品Alova
介绍alova | Alova.JS Multipart 实体请求 | Axios中文文档 | Axios中文网 1. 极致的轻量与性能 Tree-shaking优化:仅打包使用到的功能模块 零依赖:基础包仅 4KB(Axios 12KB) 2. 智能请求管理(开箱即用࿰…...
