@ResponseBody 注解
@ResponseBody 注解的作用是將Controller的方法返回的對象,通過轉(zhuǎn)換器轉(zhuǎn)換為指定的格式之后,寫入到 Response 對象的 body 區(qū),常用來返回 JSON 數(shù)據(jù)或 XML 數(shù)據(jù) 。
注意:在使用此注解之后不會再走視圖處理器,而是直接將數(shù)據(jù)寫入到輸入流中,他的效果等同于通過 Response 對象輸出指定格式的數(shù)據(jù) 。
@ResponseBody 也可以直接作用在類上的 ,最典型的例子就是 @RestController 這個(gè)注解,它就包含了 @ResponseBody 這個(gè)注解(@RestController=@ResponseBody+@Controller)
在類上用@RestController,其內(nèi)的所有方法都會默認(rèn)加上@ResponseBody,也就是默認(rèn)返回JSON格式。如果某些方法不是返回JSON的,就只能用@Controller了吧,這也是它們倆的區(qū)別。
1. @ResponseBody作用在方法上 。
@Controller
public class HelloWorld {
@RequestMapping("/hello")
@ResponseBody
public String testSpringBoot() {
return "Hello SpringBoot 2 !";
}
}

如上圖所示:在使用 @RequestMapping后,返回值通常解析為跳轉(zhuǎn)路徑,但是加上 @ResponseBody 后返回結(jié)果不會被解析為跳轉(zhuǎn)路徑,而是直接寫入 Http Response Body 中。通常在異步獲取數(shù)據(jù)時(shí)使用(AJAX)。
2. 不使用 @ResponseBody 注解 。
@Controller
@RequestMapping("/springboot")
public class HelloWorld {
@RequestMapping("/hello")
//@ResponseBody
public String testSpringBoot() {
return "SpringBoot";
}
}

SpringBoot .html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1> 峻哥帶你學(xué) SpringBoot !</h1>
</body>
</html>
如上圖所示,當(dāng)你不加@ResponseBody的時(shí)候,代碼在執(zhí)行的時(shí)候,它就會給你解析成跳轉(zhuǎn)路徑進(jìn)行對應(yīng)的跳轉(zhuǎn)。
@RequestBody 注解
1、@RequestBody 作用在方法形參上 。

如上圖所示,@RequestBody 作用在形參列表上,用于將前臺發(fā)送過來固定格式的數(shù)據(jù)(xml、json)封裝為對應(yīng)的 JavaBean 對象,封裝時(shí)使用到的一個(gè)對象是系統(tǒng)默認(rèn)配置的 HttpMessageConverter進(jìn)行解析,然后封裝到形參上 。
@RequestBody 注解則是將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個(gè)對象。
注意:
該注解用于讀取Request請求的body部分?jǐn)?shù)據(jù),使用系統(tǒng)默認(rèn)配置的HttpMessageConverter進(jìn)行解析,然后把相應(yīng)的數(shù)據(jù)綁定到要返回的對象上; 再把HttpMessageConverter返回的對象數(shù)據(jù)綁定到 controller中方法的參數(shù)上。
@requestbody和@requestparams的區(qū)別?
@RequestBody注意:
1、get請求的時(shí)候,沒有請求體,因此用@RequestBody來接收參數(shù)會報(bào)錯,錯誤狀態(tài)碼:400,詳情是:required request body is missing.....
2、post請求的時(shí)候,有請求體,但默認(rèn)的內(nèi)容格式是:application/x-www-form-urlencoded類型(也就是key1 = val1&key2=val2,因?yàn)楸韱蝹鲄⒌恼埱篌w中也是這種格式),用@RequestBody來接收參數(shù)會報(bào)錯,錯誤狀態(tài)碼:415,詳情是:unsupported media type.....
結(jié)論:@requestbody注解在接收參數(shù)的時(shí)候的請求,必須要有請求體(官方文檔:You can use the @RequestBody annotation to have the request body read and deserialized into an Object through an HttpMessageConverter.)
目前在我認(rèn)知的范圍內(nèi):在有請求體的前提下,格式包括application/json, application/xml使用@RequestBody來處理
@RequestBody
處理HttpEntity傳遞過來的數(shù)據(jù),一般用來處理非Content-Type: application/x-www-form-urlencoded編碼格式的數(shù)據(jù)。
GET請求中,因?yàn)闆]有HttpEntity,所以@RequestBody并不適用。
POST請求中,通過HttpEntity傳遞的參數(shù),必須要在請求頭中聲明數(shù)據(jù)的類型Content-Type,
SpringMVC通過使用HandlerAdapter(處理適配器) 配置的HttpMessageConverters(消息轉(zhuǎn)換工具)來解析HttpEntity中的數(shù)據(jù),然后綁定到相應(yīng)的bean上。
@RequestParam
用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內(nèi)容。
(Http協(xié)議中,如果不指定Content-Type(MIME類型),則默認(rèn)傳遞的參數(shù)就是application/x-www-form-urlencoded類型
1、瀏覽器的原生form表單
2、提交的數(shù)據(jù)都按照key1 = val1&key2=val2的方式進(jìn)行編碼,key和val都進(jìn)行了URL轉(zhuǎn)碼)
RequestParam可以接受簡單類型的屬性,也可以接受對象類型。
實(shí)質(zhì)是將Request.getParameter() 中的Key-Value參數(shù)Map利用Spring的轉(zhuǎn)化機(jī)制ConversionService配置,轉(zhuǎn)化成參數(shù)接收對象或字段。
如果在請求中設(shè)置Content-Type:application/json,那么在接收參數(shù)的時(shí)候會將整個(gè)對象以json字符串的形式傳遞到后臺,無法單獨(dú)綁定單獨(dú)屬性
————————————————
版權(quán)聲明:本文為CSDN博主「歌手愛編程」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_47267820/article/details/120286105