SpringMVC(三)响应处理

server/2025/3/15 22:31:36/

目录

响应数据类型:

一、自动 JSON 响应

1 实现解析

二、文件下载

1 核心实现

2 优化与问题


响应数据类型:

一、自动 JSON 响应

1 实现解析
  1. @RestController 作用

    • 类注解,自动将方法返回值序列化为 JSON(无需 @ResponseBody 注解)。

    • 底层依赖 HttpMessageConverter(如 Jackson 库)。

  2. emailUsers 对象封装

    • 创建 POJO 实例并填充属性,Spring 自动转换属性名为 JSON 字段(如 account → "account")。

    • 复杂属性(如 String[] hobby)会被处理为 JSON 数组。

  3. 适用场景

    • 快速构建 RESTful API,返回结构化数据(如查询用户信息)。

    • 无需手动处理响应头或内容协商。

java">    // 会自动将返回值封装成JSON格式返回给客户端@RequestMapping("/request01")public emailUsers handleRequest() {emailUsers emailUser = new emailUsers();emailUser.setAccount("zhangsan");emailUser.setPw("123456");emailUser.setGender("男");emailUser.setHid("1");emailUser.setPlace("北京");emailUser.setOther("无");emailUser.setHobby(new String[]{"打球", "看电影" });System.out.println(emailUser);return emailUser;}

二、文件下载

1 核心实现
  1. ResponseEntity<InputStreamResource>

    • 封装响应实体,精确控制状态码、头部和正文。

    • InputStreamResource 将文件流包装为响应体,避免直接加载文件到内存。

  2. 关键配置

    • 文件名编码URLEncoder.encode() 解决中文乱码。

    • 内容类型MediaType.APPLICATION_OCTET_STREAM 表示二进制流。

    • 内容长度contentLength() 声明文件大小(非必须,但利于浏览器进度显示)。

    • 下载头Content-Disposition 触发浏览器下载行为。

2 优化与问题
  1. 大文件处理

    • 问题inputStream.readAllBytes() 会将文件全部读入内存,大文件易导致 OOM。

    • 解决:直接传递 InputStreamResource 流式返回,无需预读字节。

  2. 资源关闭问题

    • 风险inputStream.close() 后仍返回 InputStreamResource,可能导致流关闭异常。

    • 建议:使用 try-with-resources 或确保流在响应结束后关闭(如通过 FileSystemResource 自动管理)。

java">    /*** 文件下载* HttpEntity:拿到整个响应数据(响应头,响应体,状态码)* 1 文件名中文会乱码* 2 文件太大会内存溢出*/@RequestMapping("/request02")public ResponseEntity<InputStreamResource> handleRequest02() throws IOException {FileInputStream inputStream = new FileInputStream("D:\\test.txt");byte[] bytes = inputStream.readAllBytes();//解决中文乱码String encode = URLEncoder.encode("文本.txt", StandardCharsets.UTF_8);//解决文件太大内存溢出InputStreamResource resource = new InputStreamResource(inputStream);inputStream.close();return ResponseEntity.ok()//文件类型.contentType(MediaType.APPLICATION_OCTET_STREAM)//内容大小.contentLength(inputStream.available())//内容处理方式.header("Content-Disposition", "attachment;filename=" + encode).body(resource);}


http://www.ppmy.cn/server/175270.html

相关文章

C#控制台应用程序学习——3.11

一、整型数字计算 如果我们想执行以下程序&#xff1a;程序提示用户输入一个数字并输出 num 20 的结果&#xff0c;我们的思维应该是这样的&#xff1a; using System;public class Class1 {public static void Main(string[] args){Console.WriteLine("Enter the first…

002-告别乱码-libiconv-C++开源库108杰

本课文包含三个视频&#xff01; 为什么中文版Windows是编程出现乱码的高发地带&#xff1f;怎么用 libiconv 把国标编码的汉字转换成宇宙统一码&#xff1f;怎么简化 libiconv 那些充满坑的 纯C 函数API&#xff1f; 1. 安装 libiconv 通常&#xff0c;你在 MSYS2 中安装过 G…

Linux各种命令大全

Linux课程笔记 目录结构 /&#xff1a;根目录&#xff0c;唯一顶级目录路径示例&#xff1a;/home/itheima/a.txt 表示根目录下的home/itheima文件夹内的a.txt 基础命令 ls&#xff1a;列出文件 ls [选项] [目录] # 选项&#xff1a; # -l 列表形式显示 # -h 人性化显示文…

mysql学习-常用sql语句

1、安装mysql参考网上链接&#xff0c;进入mysql数据库 mysql -u root -p 2、数据库操作 2.1、创建数据库 create database 数据库名 default character set utf8; 2.2、显示所有数据库 show databases; 2.3、选择数据库 use elementInfo; 2.4、删除数据库 drop database…

图论part4|827. 最大人工岛、127. 单词接龙、463. 岛屿的周长

827. 最大人工岛 &#x1f517;&#xff1a;827. 最大人工岛 - 力扣&#xff08;LeetCode&#xff09;827. 最大人工岛 - 给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。返回执行此操作后&#xff0c;grid 中最大的岛屿面积是多少&#xff1f;岛屿 由一…

基于图像比对的跨平台UI一致性校验工具开发全流程指南——Android/iOS/Web三端自动化测试实战

一、需求背景与方案概述 1.1 为什么需要跨平台UI校验&#xff1f; 在移动互联网时代&#xff0c;同一产品需覆盖Android、iOS和Web三端。由于不同平台的开发框架&#xff08;如Android的Material Design与iOS的Cupertino风格&#xff09;及渲染引擎差异&#xff0c;UI界面易出…

​​vue-router编程式导航,params传参拿不到

vue-router在4.14版本就废弃这种传参方式了 原因&#xff1a;​​这种传参本来就不是官方推荐的&#xff0c;比如页面刷新会引起参数丢失​ 官方解释 官方解释翻译后的截图&#xff1a; 解决&#xff08;官方推荐了很多种解决方式&#xff0c;下面列举出快捷高效的修改方式&a…

【QT5 Widgets示例】Model/View编程初探

文章目录 Model/ViewModel/View编程的优点常见Model类和View类Model/View应用程序示例只读的表格修改文本外观显示变化的数据设置表格标头可编辑视图示例树结构视图示例获取视图选中项 Model/View Model/View编程的优点 Model/View编程介绍&#xff1a;https://doc.qt.io/qt-…