Salmon的全栈知识 Salmon的全栈知识
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • SpringCloud Gateway
  • Apollo
  • Eureka
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • SpringCloud Gateway
  • Apollo
  • Eureka
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Spring框架

    • 传统Javaweb开发的困惑
    • IoC、DI和AOP思想提出
    • Spring框架的诞生
    • 基于xml的Spring应用
    • 基于注解的Spring应用
    • AOP 简介
    • 基于xml配置的AOP
    • 基于注解配置的AOP
    • 基于AOP的声明式事务控制
  • SpringMVC框架

    • Spring整合web环境
    • web层MVC框架思想与设计思路
    • SpringMVC简介
    • SpringMVC的请求处理
    • SpringMVC的响应处理
      • 1、传统同步业务数据响应
      • 2、前后端分离异步业务数据响应
    • SpringMVC的拦截器
    • SpringMVC的全注解开发
    • SpringMVC的组件原理剖析
    • SpringMVC的异常处理机制
  • 《Spring生态》笔记
  • SpringMVC框架
Salmon
2025-07-23
目录

SpringMVC的响应处理

# 1、传统同步业务数据响应

Spring的接收请求的部分我们讲完了,下面在看一下Spring怎么给客户端响应数据,响应数据主要分为两大部分:

  • 传统同步方式:准备好模型数据,在跳转到执行页面进行展示,此方式使用越来越少了,基于历史原因,一些旧项目还在使用;

  • 前后端分离异步方式:前端使用Ajax技术+Restful风格与服务端进行Json格式为主的数据交互,目前市场上几乎都是此种方式了。

传统同步业务在数据响应时,SpringMVC又涉及如下四种形式:

  • 请求资源转发;

  • 请求资源重定向;

  • 响应模型数据;

  • 直接回写数据给客户端;

请求资源转发

image-20250729004143326

响应模型数据,响应模型数据本质也是转发,在转发时可以准备模型数据

@GetMapping("/forward5")
public ModelAndView forward5(ModelAndView modelAndView) {
    // 准备 JavaBean 模型数据
    User user = new User();
    user.setUsername("haohao");

    // 设置模型
    modelAndView.addObject("user", user);

    // 设置视图(转发到 JSP 页面)
    modelAndView.setViewName("/index.jsp");

    return modelAndView;
}

直接回写数据,直接通过方法的返回值返回给客户端的字符串,但是SpringMVC默认的方法返回值是视图,可以通过 @ResponseBody 注解显示的告知此处的返回值不要进行视图处理,是要以响应体的方式处理的

@GetMapping("/response2")
@ResponseBody
public String response2() throws IOException {
   return "Hello haohao!";
}

# 2、前后端分离异步业务数据响应

其实此处的会写数据,跟上面回写数据给客户端的语法方式一样,只不过有如下一些区别:

  • 同步方式回写数据,是将数据响应给浏览器进行页面展示的,而异步方式回写数据一般是回写给Ajax引擎的,即谁访问服务器端,服务器端就将数据响应给谁

  • 同步方式回写的数据,一般就是一些无特定格式的字符串,而异步方式回写的数据大多是Json格式字符串

回写普通数据使用@ResponseBody标注方法,直接返回字符串即可,此处不在说明;

回写Json格式的字符串,即将直接拼接Json格式的字符串或使用工具将JavaBean转换成Json格式的字符串回写

@GetMapping("/response3")
@ResponseBody
public String response3(HttpServletResponse response) {
    // 手动构造 JSON 字符串返回
    return "{\"username\":\"haohao\",\"age\":18}";
}

@GetMapping("/response4")
@ResponseBody
public String response4() throws JsonProcessingException {
    // 创建JavaBean
    User user = new User();
    user.setUsername("haohao");
    user.setAge(18);
    // 使用Jackson转换成json格式的字符串
    String json = new ObjectMapper().writeValueAsString(user);
    return json;
}

在讲解SringMVC接收请求数据时,客户端提交的Json格式的字符串,也是使用Jackson进行的手动转换成JavaBean,可以当我们使用了@RequestBody时,直接用JavaBean就接收了Json格式的数据,原理其实就是SpringMVC底层帮我们做了转换,此处@ResponseBody也可以将JavaBean自动给我们转换成Json格式字符串回响应

@GetMapping("/response5")
@ResponseBody
public User response5() {
    // 创建 JavaBean 对象
    User user = new User();
    user.setUsername("haohao");
    user.setAge(18);

    // 直接返回对象,Spring Boot 会自动转为 JSON 格式
    return user;
}

@ResponseBody注解使用优化,在进行前后端分离开发时,Controller的每个方法都是直接回写数据的,所以每个方法上都得写@ResponseBody,可以将@ResponseBody写到Controller上,那么该Controller中的所有方法都具备了返回响应体数据的功能了

@Controller
@ResponseBody
public class UserController {

    @GetMapping("/response5")
    public User response5() throws JsonProcessingException {
        User user = new User();
        user.setUsername("haohao");
        user.setAge(18);
        return user;
    }

    @GetMapping("/response7")
    public ResultInfo response7() {
        ResultInfo info = new ResultInfo();
        // 设置 info 的属性
        return info;
    }

    // ... 其他方法 ...
}

进一步优化,可以使用@RestController替代@Controller和@ResponseBody,@RestController内部具备的这两个注解的功能

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/response7")
    public ResultInfo response7() {
        // 省略其他代码
        return info;
    }

    @GetMapping("/response5")
    public User response5() throws JsonProcessingException {
        // 省略其他代码
        return user;
    }

    // ... 省略其他方法 ...
}
上次更新: 2025/07/28, 17:18:00
SpringMVC的请求处理
SpringMVC的拦截器

← SpringMVC的请求处理 SpringMVC的拦截器→

Theme by Vdoing | Copyright © 2022-2025 Salmon's Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式