响应数据类型笔记

一、常用类型

类型 作用 典型场景示例
@ResponseBody + 对象 响应 JSON 等非页面数据 接口返回用户信息、列表数据
ResponseEntity<B> 完全自定义响应头、响应体数据 文件下载(自定义 Content-Disposition 等头)
String 返回逻辑视图地址(用于页面渲染) 跳转到 Thymeleaf 模板页面
Map/Model 传递默认视图地址与数据(页面渲染用) 向页面共享用户列表、用户名等数据
ModelAndView 自定义模型和视图 同时指定页面模板和共享数据

二、不常用类型

类型 作用 适用场景
HttpEntity<B> 自定义响应头、响应体数据 类似 ResponseEntity,但灵活性稍弱
HttpHeaders 仅返回响应头,无内容 需单独设置响应头的场景
ErrorResponse/ProblemDetail 响应错误头、错误体 标准化的 API 错误返回
View 视图对象 自定义视图渲染逻辑
@ModelAttribute 传递默认视图地址与数据 页面渲染时共享数据
void 需自定义 response 直接操作 HttpServletResponse 输出
ListenableFuture<V>/CompletableFuture<V> 异步结果响应 异步任务的结果返回
ResponseBodyEmitter/SseEmitter 异步响应与流式数据响应 服务端推送、长轮询场景
StreamingResponseBody 流式数据响应 大文件分块传输
ReactiveAdapterRegistry Webflux 模式支持 响应式编程场景
DeferredResult/Callable 异步结果响应 异步处理 HTTP 请求
其他返回类型 被当做 ModelAttribute 自动加入模型数据

三、常用类型及示例

1. @ResponseBody + 对象

  • 作用:响应 JSON 等非页面数据
  • 示例
1
2
3
4
5
6
7
8
9
10
11
@RestController
public class UserController {
@GetMapping("/user")
@ResponseBody
public User getUser() {
User user = new User();
user.setId(1L);
user.setName("张三");
return user; // 自动转 JSON 响应
}
}

2. ResponseEntity<B>

  • 作用:完全自定义响应头、响应体数据
  • 示例(文件下载)
1
2
3
4
5
6
7
8
@GetMapping("/download")
public ResponseEntity<byte[]> downloadFile() throws IOException {
byte[] fileBytes = Files.readAllBytes(Paths.get("D:\\Aimg\\MaYi.jpg"));
return ResponseEntity.ok()
.header("Content-Disposition", "attachment; filename=美女.jpg")
.contentType(MediaType.IMAGE_JPEG)
.body(fileBytes);
}

3. String

  • 作用:返回逻辑视图地址(用于页面渲染)
  • 示例(跳转到 Thymeleaf 页面)
1
2
3
4
5
6
7
@Controller
public class PageController {
@GetMapping("/login")
public String toLoginPage() {
return "login"; // 对应 templates/login.html
}
}

4. Map/Model

  • 作用:传递默认视图地址与数据(页面渲染用)
  • 示例(向页面共享用户数据)
1
2
3
4
5
6
7
8
9
10
11
12
@Controller
public class UserController {
@GetMapping("/user/list")
public String getUserList(Model model) {
List<User> users = Arrays.asList(
new User(1L, "张三", 20),
new User(2L, "李四", 25)
);
model.addAttribute("users", users); // 共享用户列表到页面
return "user/list"; // 对应 templates/user/list.html
}
}

5. ModelAndView

  • 作用:自定义模型和视图
  • 示例(同时指定页面和数据)
1
2
3
4
5
6
7
8
9
10
@Controller
public class OrderController {
@GetMapping("/order/detail")
public ModelAndView getOrderDetail() {
ModelAndView mv = new ModelAndView("order/detail"); // 指定视图
mv.addObject("orderId", 1001);
mv.addObject("amount", 99.9);
return mv; // 传递数据并跳转页面
}
}