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

SpringMVC(三)响应处理

目录

响应数据类型:

一、自动 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,返回结构化数据(如查询用户信息)。

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

    // 会自动将返回值封装成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 自动管理)。

    /**
     * 文件下载
     * 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);
    }

相关文章:

  • 构建智能汽车地图标准体系:自动驾驶技术的基石
  • 一文讲清楚CUDA与PyTorch、GPU之间的关系
  • 基于Python的selenium入门超详细教程(第1章)--WebDriver API篇
  • 【Linux-传输层协议TCP】TCP协议段格式+确认应答+超时重传+连接管理机制(三次握手、四次挥手、理解TIME_WAIT + CLOSE_WAIT)
  • 结构型——适配器模式
  • 二维数组常见应用场景以及示例
  • [Ai 力扣题单] 数组基本操作篇 27/704/344/386
  • Linux系统性能调优
  • 数据库系统原理|课程回顾与习题部分参考答案
  • 区间预测 | Matlab实现QRBiTCN分位数回归双向时间卷积神经网络注意力机制时序区间预测
  • Python画图
  • Markdown:Mermaid 画图
  • 【Go类库分享】Go expr 通用表达式引擎
  • Flutter 从入门到进阶:构建跨平台应用的最佳实践
  • 结构型——装饰器模式
  • 【Jmeter】使用教程
  • Redis Sentinel 及 Redisson 连接问题全解析
  • 【Qt】qApp简单介绍
  • 基于Flink SQL的实时指标多维分析模型
  • Kotlin高效实现 Android ViewPager2 顶部导航:动态配置与性能优化指南
  • 做爰视频免费安全的网站/bt磁力种子
  • 纹身网站建设/微营销平台有哪些
  • 成功的网站必须具备的要素/搜索引擎优化方式
  • 源码做网站图文教程/seo点击工具
  • 小卖部做网站/优化公司结构
  • 做网站技术含量/自己创建个人免费网站