多了这个@ResponseBody和没加有什么区别?还有@RequestBody呢?

391 阅读2分钟

声明:菜鸡学习记录,大佬请滑走,因为确实没有学习干货

做项目中用到,有所疑惑的点

多了这个@ResponseBody和没加有什么区别?

解释

  1. 不加@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等视图模板进行渲染

  1. 加了@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-Typeapplication/x-www-form-urlencoded multipart/form-dataapplication/json application/xml
数据位置URL查询参数 或 Form表单数据请求体(RequestBody)
数据格式键值对(key=value&key2=value2)JSON/XML等结构化数据
参数绑定每个参数单独绑定整个对象一次性绑定
嵌套对象支持有限(如user.address.city完全支持复杂嵌套对象
适用场景表单提交、简单参数RESTful API、复杂数据
文件上传支持(multipart/form-data)不支持(需要混合使用)