javaWeb傳收參數(shù)方式總結(jié)示例分析
首先梳理一下HTTP的一些知識(shí)
有時(shí)候,我真會(huì)被傳參搞得頭暈,這樣傳要怎么接收,那樣傳又要怎么接收? get可以json嗎?什么是json方式提交?等等問題,已困擾我許久 所以,在此想做個(gè)總結(jié),整理一下思緒,不再為傳收參煩惱!如有錯(cuò)誤,望聯(lián)系糾正,感謝!
1.GET和POST請(qǐng)求,在傳參方面有什么區(qū)別
GET傳輸?shù)臄?shù)據(jù)存儲(chǔ)在URL上進(jìn)行拼接 POST傳輸?shù)臄?shù)據(jù)存儲(chǔ)在Requst Body(請(qǐng)求體)中
2.http請(qǐng)求的中Content-Type
http的請(qǐng)求頭和響應(yīng)頭中都有Content-Type字段,這個(gè)字段向我們說明了請(qǐng)求和響應(yīng)的HTTP body(請(qǐng)求體或響應(yīng)體)存儲(chǔ)了什么類型的數(shù)據(jù),然后客戶端和服務(wù)端就可以根據(jù)http頭部得Content-Type正確解碼HTTP body內(nèi)容。
關(guān)聯(lián)第1點(diǎn):GET方式的請(qǐng)求和Content-Type是沒有任何關(guān)系的,因?yàn)镚ET請(qǐng)求的數(shù)據(jù)在URL上。
好叻,進(jìn)入正題。這里我們分為3種情況說明如何傳參與接參,分別為 GET方式請(qǐng)求、 表單提交、 Json提交
GET方式請(qǐng)求
(1).普通URL get請(qǐng)求
http://localhost:8080/ajaxGet?id=1&username=用戶名&userTrueName=真實(shí)姓名
//get也可以傳json,通過參數(shù)傳json字符串,然后后端進(jìn)行解析(不過一般都不這么做)
http://localhost:8080/ajaxGet?user={"id":"1","username":"用戶名","userTrueName":"真實(shí)姓名"}
(2).表單類GET請(qǐng)求
<form id="fromGet" action="fromGet" method="GET"> <input type="text"name="id" value="1"> <input type="text"name="username" value="用戶名"> <input type="text" name="userTrueName" value="真實(shí)名字"> </form>
(3).AJAX Get請(qǐng)求
(A)正確示例
$.ajax({
type: "GET",
url: "http://localhost:8080/ajaxGet",
data:{"id":1,"username":"用戶名","userTrueName":"真實(shí)名稱"},
//contentType:'application/x-www-form-urlencoded'
contentType:'application/json'
});注意:
1.data必須為json對(duì)象
2.實(shí)際上無需設(shè)置contentType
示例中我故意設(shè)置了contentType,但其實(shí)不管設(shè)置成什么都是無效的,因?yàn)閭鬏數(shù)臄?shù)據(jù)會(huì)在發(fā)送請(qǐng)求時(shí),對(duì)Json對(duì)象進(jìn)行編碼解析,拼接到URL上,如下圖

(B)錯(cuò)誤示例(data為json字符串)
//data為json字符串
$.ajax({
type: "GET",
url: "http://localhost:8080/ajaxGet",
data:JSON.stringify({"id":1,"username":"用戶名","userTrueName":"真實(shí)名稱"}),
//contentType:'application/x-www-form-urlencoded'
contentType:'application/json'
});GET請(qǐng)求時(shí),data不能使用json字符串,無法解析,如下圖

SpringMvc接收參數(shù)方式
1.實(shí)體類接收 2.Map接收,必須使用@RequestParam注解 3.拆開單個(gè)參數(shù)接收(參數(shù)少的情況可使用)
Form表單提交
ps:針對(duì)POST,第一點(diǎn)包含了所有GET請(qǐng)求方式
form表單提交一般說的是content-type為x-www-form-unlencoded或multipart/form-data的請(qǐng)求
(1) 傳統(tǒng)form表單提交,默認(rèn)content-type為 x-www-form-unlencoded,如下
<form id="fromPost" action="fromPost" method="POST">
<input type="text"name="id" value="1">
<input type="text"name="username" value="用戶名">
<input type="text" name="userTrueName" value="真實(shí)名字">
</form>(2) 含文件的form表單,需要指明enctype為 multipart/form-data(enctype相當(dāng)于content-type)
<form id="fromMutli" action="fromMutli" enctype="multipart/form-data" method="POST">
<input type="text"name="id" value="1">
<input type="file" name="file">
</form>(3) Ajaxform表單提交
//data為json對(duì)象
$.ajax({
type: "POST",
url: "http://localhost:8080/ajaxPost",
dataType: 'json',
data:{"id":1,"username":"用戶名","userTrueName":"真實(shí)名稱"},
contentType:'application/x-www-form-urlencoded'
});SpringMvc接收參數(shù)方式
1.實(shí)體類接收
2.Map接收,必須使用@RequestParam注解
3.拆開單個(gè)參數(shù)接收(參數(shù)少的情況可使用)
4.后臺(tái)的file文件需要使用MultipartFile類型接收
Json提交
ps:針對(duì)POST,第一點(diǎn)包含了所有GET請(qǐng)求方式
Json提交一般說的是content-type為application/json的請(qǐng)求,傳輸?shù)腏son是Json字符串
正確示例
//注意:data為json字符串 contentType為application/json
$.ajax({
type: "POST",
url: "http://localhost:8080/ajaxPost",
dataType: 'json',
data:JSON.stringify({"id":1,"username":"用戶名","userTrueName":"真實(shí)名稱"}),
contentType:'application/json;charset=urf-8'
});注意:data為Json字符串,這個(gè)很重要
SpringMvc接收參數(shù)方式
必須使用@RequestBody注解
1.字符串接收,然后對(duì)Json字符串解析轉(zhuǎn)換
2.實(shí)體類接收
3.Map接收
如下:
@PostMapping(value = "ajaxPost")
public void ajaxPost(@RequestBody String param){
JSONObject json = JSON.parseObject(param);
}@PostMapping(value = "ajaxPost")
public void ajaxPost(@RequestBody User user){
}@PostMapping(value = "ajaxPost")
public void ajaxPost(@RequestBody Map map){
}總結(jié)
1.GET請(qǐng)求方式與Form提交,后端spingMvc接收參數(shù)方式相同,如下
- (1)實(shí)體類接收
- (2)Map接收,必須使用@RequestParam注解
- (3)拆開單個(gè)參數(shù)接收(參數(shù)少的情況使用)
- (4)后臺(tái)的file文件需要使用MultipartFil類型接收(form表單文件提交)
2.Json提交
必須使用@RequestBody注解
- (1)字符串接收,然后對(duì)json字符串解析轉(zhuǎn)換
- (2)實(shí)體類接收
- (3)Map接收
建議
- (1)參數(shù)少的查詢使用Get請(qǐng)求,參數(shù)多可使用Post
- (2)涉及到數(shù)據(jù)庫的修改操作,使用Post請(qǐng)求
- (3)Post請(qǐng)求統(tǒng)一使用Json提交(即content-type=application/json),統(tǒng)一方式方便前后端聯(lián)調(diào),json傳參靈活
- (4)參數(shù)多的,使用實(shí)體類接收,因?yàn)镸ap含有參數(shù)的不確定性,根本看不出你需要的啥參數(shù),寧愿新建一個(gè)實(shí)體類接收參數(shù),可增強(qiáng)代碼的可讀性
比如使用swagger api文檔時(shí),可使用注解標(biāo)注的實(shí)體類對(duì)應(yīng)參數(shù),但用map的話,你要啥參數(shù),鬼知道咯~
拓展知識(shí):
@RequestParam注解
其實(shí)使用注解@RequestParam就等同于request.getParamter獲取參數(shù) 但@RequestParam有更多的用處,它有以下幾個(gè)重要屬性
(1).value:前端傳參的參數(shù)名稱,這個(gè)屬性可以使得前端參數(shù)名字與方法參數(shù)名不相同,使用這個(gè)參數(shù)進(jìn)行數(shù)據(jù)綁定就ok了
//前端傳參可以是"name" 方法參數(shù)中為"userName"
//使用@RequestParam("name")可將name和userName進(jìn)行綁定
//即可使用userName接收name的數(shù)據(jù)
@RequestMapping("/test")
public void test(@RequestParam("name") String userName)){
}(2)requried:表示是否是必須的參數(shù),默認(rèn)為true,所以加上@RequestParam,默認(rèn)這個(gè)參數(shù)就是必須的,如果沒有傳對(duì)應(yīng)參數(shù)會(huì)報(bào)錯(cuò)
(3)defaultValue:參數(shù)默認(rèn)值。即設(shè)置默認(rèn)值后,沒有傳參時(shí),會(huì)賦予參數(shù)一個(gè)默認(rèn)值。設(shè)置了默認(rèn)值,就算必須參數(shù)不傳也不會(huì)報(bào)錯(cuò)
以上就是javaWeb傳收參數(shù)方式總結(jié)示例分析的詳細(xì)內(nèi)容,更多關(guān)于javaWeb傳收參數(shù)方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MyBatis參數(shù)綁定中參數(shù)名不一致導(dǎo)致的錯(cuò)誤問題解決方法
作為一名Java開發(fā)者,我在實(shí)際項(xiàng)目中曾多次遇到MyBatis參數(shù)綁定的問題,其中最常見的一種情況是MyBatis參數(shù)綁定中參數(shù)名不一致導(dǎo)致的錯(cuò)誤,這類問題看似簡(jiǎn)單,但若不深入理解MyBatis的參數(shù)綁定機(jī)制,極易陷入誤區(qū),本文將帶大家一起探討解決方案,需要的朋友可以參考下2025-06-06
不到十行實(shí)現(xiàn)javaCV圖片OCR文字識(shí)別
識(shí)別圖片中的文字,會(huì)省很多時(shí)間,本文介紹了javaCV圖片OCR文字識(shí)別,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
淺談xml配置spring profiles的幾個(gè)注意點(diǎn)
這篇文章主要介紹了淺談xml配置spring profiles的幾個(gè)注意點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Spring @Valid和@Validated區(qū)別和用法實(shí)例
這篇文章主要介紹了Spring @Valid和@Validated區(qū)別和用法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
深入學(xué)習(xí)Spring Boot排查 @Transactional 引起的 NullPointerException問題
這篇文章主要介紹了深入學(xué)習(xí)Spring Boot排查 @Transactional 引起的 NullPointerException問題,需要的朋友可以參考下2018-01-01
Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的鏈表的概念與實(shí)現(xiàn)
鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針連接次序?qū)崿F(xiàn)的,每一個(gè)鏈表都包含多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)又包含兩個(gè)部分,一個(gè)是數(shù)據(jù)域,一個(gè)是引用域2022-03-03
Springboot動(dòng)態(tài)配置AOP切點(diǎn)詳解
這篇文章主要介紹了Springboot動(dòng)態(tài)配置AOP切點(diǎn)詳解,Springboot 可以定義注解切點(diǎn)去攔截注解修飾的類方法以及execution(xxxx)切點(diǎn)去攔截具體的類方法,默認(rèn)情況下我們都會(huì)使用注解@PointCut去定義切點(diǎn),然后定義切面攔截切點(diǎn),需要的朋友可以參考下2023-09-09

