本文僅僅是使用層面的解釋
- @ResponseBody
該註解用於將Controller的方法返回的對象,通過適當的HttpMessageConverter轉換爲指定格式後,寫入到Response對象的body數據區。
使用時機:返回的數據不是html標籤的頁面,而是其他某種格式的數據時(如json、xml等)使用;
簡而言之,就是會將controller返回的對象,換成了key-value型式的數據
例子:
@RequestMapping("/login.do")
@ResponseBody
public Object login(String name, String password, HttpSession session) {
user = userService.checkLogin(name, password);
session.setAttribute("user", user);
return new JsonResult(user);
}
- @RequestBody和@RequestParam()
參考文檔
總結如下:
這兩個是用來接受數據的註解
RequestParam內部有4個參數: - value請求參數的參數名,作爲參數映射名稱。
- name同value
- required該參數是否必填,默認爲true(必填),當設置成必填時,如果沒有傳入參數,報錯。
- defaultValue 設置請求參數的默認值。
例子:
package com.lanhuigu.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
1. RequestParam註解綁定請求參數
2. @author yihonglei
*/
@Controller
@RequestMapping("/testRP")
public class RequestParamController {
private static final String SUCCESS="success";
/**
* @RequestParam 映射請求參數
* value 請求參數的參數名 ,作爲參數映射名稱
* required 該參數是否必填,默認爲true(必填),當設置成必填時,如果沒有傳入參數,報錯
* defaultValue 設置請求參數的默認值
*/
@RequestMapping(value="/testRequestParam")
public String testRequestParam(
@RequestParam("username") String username,
@RequestParam(value="age",required=false,defaultValue="0") int age) {
System.out.println("testRequestParam,username="+username+",age="+age);
return SUCCESS;
}
}
@RequestBody基礎知識介紹:
- @RequestBody主要用來接收前端傳遞給後端的json字符串中的數據的(請求體中的數據的);GET方式無請求體,所以使用@RequestBody接收數據時,前端不能使用GET方式提交數據,而是用POST方式進行提交。
- 在後端的同一個接收方法裏,@RequestBody與@RequestParam()可以同時使用,@RequestBody最多只能有一個,而@RequestParam()可以有多個。
- 當同時使用@RequestParam()和@RequestBody時,@RequestParam()指定的參數可以是普通元素、數組、集合、對象等等
即:如果參數時放在請求體中,傳入後臺的話,那麼後臺要用@RequestBody才能接收到;如果不是放在
請求體中的話,那麼後臺接收前臺傳過來的參數時,要@RequestParam來接收,或則形參前什麼也不寫也能接收。
4.如果參數前寫了@RequestParam(xxx),那麼前端必須有對應的xxx名字才行(不管其是否有值,當然可以通過設置該註解的required屬性來調節是否必須傳),如果沒有xxx名的話,那麼請求會出錯,報400;如果參數前不寫@RequestParam(xxx)的話,那麼就前端可以有也可以沒有對應的xxx名字,如果有xxx名
的話,那麼就會自動匹配;沒有的話,請求也能正確發送。追注:這裏與feign消費服務時不同;feign消費服務時,如果參數前什麼也不寫,那麼會被默認是@RequestBody的。
@RequestBody前後端數據的接受
前端是通過key-value的形式傳進來的,後端的接受情況如下:
json字符串中,
如果value爲"“的話,後端對應屬性如果是String類型的,那麼接受到的就是”",如果是後端屬性的類型是Integer、Double等類型,那麼接收到的就是null。
如果value爲null的話,後端對應收到的就是null。
千萬不能傳空值
相關用法:
@RequestBody可以以String、簡單對象、複雜對象來進行數據接受
User實體類:
Team實體類:
@RequestBody直接以String接收前端傳過來的json數據:
後端對應的Controller:
使用PostMan測試:
@RequestBody以簡單對象接收前端傳過來的json數據:
後端對應的Controller:
使用PostMan測試:
@RequestBody以複雜對象接收前端傳過來的json數據:
後端對應的Controller:
使用PostMan測試:
@RequestBody與簡單的@RequestParam()同時使用:
後端對應的Controller:
使用PostMan測試:
@RequestBody與複雜的@RequestParam()同時使用:
後端對應的Controller:
使用PostMan測試:
@RequestBody接收請求體中的json數據;不加註解接收URL中的數據並組裝爲對象:
後端對應的Controller:
使用PostMan測試:
原文中還有一些更深的探討,原理型的探討