声明:菜鸡学习记录,大佬请滑走,因为确实没有学习干货
做项目中用到,有所疑惑的点
多了这个@ResponseBody和没加有什么区别?
解释
-
不加@ResponseBody(默认视图解析)
- 返回值类型是逻辑视图名(String类型)或 ModelAndView对象
- 例子
@Controller
@RequestMapping("/old")
public class OldController {
@GetMapping("/page")
public String showPage(Model model) {
model.addAttribute("message", "Hello World");
return "page"; // 返回视图名称,由视图解析器解析为/WEB-INF/views/page.jsp
}
}
结果:Spring会通过视图解析器查找对应的JSP/Thymeleaf等视图模板进行渲染
- 加了@ResponseBody(直接写入响应体)
- 返回值类型:任意类型(自动根据内容协商转换)
@Controller
@RequestMapping("/api")
public class ApiController {
@ResponseBody
@GetMapping("/data")
public Map<String, Object> getData() {
return Map.of("status", "success", "code", 200);
}
}
-
结果:
- 自动使用
HttpMessageConverter进行序列化(JSON/XML 等) - 示例响应头:
Content-Type: application/json - 响应体:
{"status":"success","code":200}
- 自动使用
@RequestBody
没有的情况
默认行为(参数级)
@PostMapping("/order/create")
public String createOrder(String orderNo, String productName, Integer quantity) {
// 参数来自URL查询字符串 或 form-data
}
请求行为1:URL查询参数
POST /order/create?orderNo=20231224001&productName=iPhone&quantity=1
Content-Type: application/x-www-form-urlencoded
请求行为2:Form表单提交
<form action="/order/create" method="post">
<input name="orderNo" value="20231224001">
<input name="productName" value="iPhone">
<input name="quantity" value="1">
</form>
请求方式3: from-data (文件上传)
POST /order/create
Content-Type: multipart/form-data; boundary=boundary
--boundary
Content-Disposition: form-data; name="orderNo"
20231224001
--boundary
Content-Disposition: form-data; name="productName"
iPhone
有 @RequestBody的情况
@PostMapping("/order/create")
public String createOrder(@RequestBody OrderReq req) {
// req对象从请求体JSON/XML反序列化而来
}
@Data
public class OrderReq {
private String orderNo;
private String productName;
private Integer quantity;
}
请求方式:必须是JSON/XML格式
POST /order/create
Content-Type: application/json
{
"orderNo": "20231224001",
"productName": "iPhone",
"quantity": 1
}
| 特性 | 没有 @RequestBody | 有 @RequestBody |
|---|---|---|
| Content-Type | application/x-www-form-urlencoded multipart/form-data | application/json application/xml |
| 数据位置 | URL查询参数 或 Form表单数据 | 请求体(RequestBody) |
| 数据格式 | 键值对(key=value&key2=value2) | JSON/XML等结构化数据 |
| 参数绑定 | 每个参数单独绑定 | 整个对象一次性绑定 |
| 嵌套对象 | 支持有限(如user.address.city) | 完全支持复杂嵌套对象 |
| 适用场景 | 表单提交、简单参数 | RESTful API、复杂数据 |
| 文件上传 | 支持(multipart/form-data) | 不支持(需要混合使用) |