訪問不同的路徑,就是發(fā)送不同的請(qǐng)求.在發(fā)送請(qǐng)求時(shí),可能會(huì)帶?些參數(shù),所以我們?cè)趯W(xué)習(xí)Spring的請(qǐng)求時(shí),主要是學(xué)習(xí)如何傳遞參數(shù)到后端以及后端如何接收.
下面博主會(huì)對(duì)傳遞參數(shù)進(jìn)行一個(gè)詳解,咱們主要是使?瀏覽器和Postman來(lái)模擬
??傳遞單個(gè)參數(shù)
@RestController
public class hello {
@RequestMapping("/test")
public String test(String name){
return "接受到的參數(shù):"+name;
}
}
當(dāng)我們運(yùn)行后,用瀏覽器進(jìn)行訪問
http://127.0.0.1:8080/pt/test1?name=山頂是一定要去的
訪問結(jié)果如下:
注意:
- 如果參數(shù)名不一致,獲取不到參數(shù),默認(rèn)沒有傳參,默認(rèn)值為null
- 如果參數(shù)類型不?致,是會(huì)進(jìn)行報(bào)錯(cuò)的
@RestController
public class hello {
@RequestMapping("/test")
public String test(Integer name){
return "接受到的參數(shù):"+name;
}
}
注意:
- 如果使?基本類型來(lái)接收參數(shù)時(shí),參數(shù)必須傳(除boolean類型),否則會(huì)報(bào)500錯(cuò)誤
@RestController
public class hello {
@RequestMapping("/test")
public String test(int name){
return "接受到的參數(shù):"+name;
}
}
日志中也會(huì)進(jìn)行報(bào)錯(cuò)。
建議使用包裝類?。?!
??傳遞多個(gè)參數(shù)
與傳遞單個(gè)參數(shù)一樣
不同的是當(dāng)有多個(gè)參數(shù)時(shí),前后端進(jìn)?參數(shù)匹配時(shí),是以參數(shù)的名稱進(jìn)?匹配的,因此參數(shù)的位置是不影響后端獲取參數(shù)的結(jié)果
??傳遞對(duì)象
如果參數(shù)?較多時(shí),?法聲明就需要有很多形參.并且后續(xù)每次新增?個(gè)參數(shù),也需要修改?法聲明.
我們不妨把這些參數(shù)封裝為?個(gè)對(duì)象.
Spring MVC也可以?動(dòng)實(shí)現(xiàn)對(duì)象參數(shù)的賦值,?如Person對(duì)象
public class Person {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
@RequestMapping("test5")
public String test5(Person person) {
return "接收到的參數(shù)名為:" + person.toString();
}
注意:
Spring會(huì)根據(jù)參數(shù)名稱?動(dòng)綁定到對(duì)象的各個(gè)屬性上,如果某個(gè)屬性未傳遞,則賦值為null(基本類型則賦值為默認(rèn)初識(shí)值,?如int類型的屬性,會(huì)被賦值為0)
??后端參數(shù)重命名(后端參數(shù)映射)
某些特殊的情況下,前端傳遞的參數(shù)key和我們后端接收的key可以不?致,?如前端傳遞了?個(gè)time給后端,?后端是使?createtime字段來(lái)接收的,這樣就會(huì)出現(xiàn)參數(shù)接收不到的情況,如果出現(xiàn)這種情況,我們就可以使? @RequestParam 來(lái)重命名前后端的參數(shù)值.
@RequestMapping("test6")
public String test6(@RequestParam("time") String createtime) {
return "接收到的參數(shù)名為:" + createtime;
}
注意:
- 使? @RequestParam 進(jìn)?參數(shù)重命名時(shí),請(qǐng)求參數(shù)只能和@RequestParam 聲明的名稱?致,才能進(jìn)?參數(shù)綁定和賦值.
- 使? @RequestParam 進(jìn)?參數(shù)重命名時(shí),參數(shù)就變成了必傳參數(shù)
- 如果我們不想讓他變成必傳參數(shù),我們可以通過設(shè)置@RequestParam 中的 required=false (默認(rèn)為true,必傳)來(lái)避免不傳遞時(shí)報(bào)錯(cuò)
@RequestMapping("test6")
public String test6(@RequestParam(value = "time",required = false) String createtime) {
return "接收到的參數(shù)名為:" + createtime;
}
??傳遞數(shù)組
Spring MVC 可以?動(dòng)綁定數(shù)組參數(shù)的賦值
@RequestMapping("test7")
public String test7(String[] names) {
return "接收到的參數(shù)名為:" + Arrays.toString(names);
}
數(shù)組傳參時(shí),有以下幾種:
1:http://127.0.0.1:8080/pt/test7?names=張三&names=李四
2:http://127.0.0.1:8080/pt/test7?names=張三%2c李四
3:http://127.0.0.1:8080/pt/test7?names=張三,李四
??傳遞集合
集合參數(shù):和數(shù)組類似,同?個(gè)請(qǐng)求參數(shù)名有為多個(gè)
不同的時(shí)需要使? @RequestParam 綁定參數(shù)關(guān)系
傳參方式與上述數(shù)組傳參三種方式一樣
@RequestMapping("/m6")
public String method6(@RequestParam List<String> listParam){
return "size:"+listParam.size() + ",listParam:"+listParam;
}
??傳遞JSON數(shù)據(jù)
??JSON概念
JSON:JavaScript Object Notation【JavaScript對(duì)象表?法】
JSON是?種輕量級(jí)的數(shù)據(jù)交互格式.它基于ECMAScript(歐洲計(jì)算機(jī)協(xié)會(huì)制定的js規(guī)范)的?個(gè)?集,采?完全獨(dú)?于編程語(yǔ)?的?本格式來(lái)存儲(chǔ)和表?數(shù)據(jù)。
簡(jiǎn)單來(lái)說(shuō):JSON就是?種數(shù)據(jù)格式,有??的格式和語(yǔ)法,使??本表??個(gè)對(duì)象或數(shù)組的信息,因此JSON本質(zhì)是字符串.
主要負(fù)責(zé)在不同的語(yǔ)?中數(shù)據(jù)傳遞和交換
??JSON的語(yǔ)法
- 數(shù)據(jù)在 鍵值對(duì)(Key/Value) 中
- 數(shù)據(jù)由逗號(hào) , 分隔
- 對(duì)象? {} 表?
- 數(shù)組? [] 表?
- 值可以為對(duì)象,也可以為數(shù)組,數(shù)組中可以包含多個(gè)對(duì)象
??JSON的兩種結(jié)構(gòu)
- 對(duì)象:?括號(hào) {} 保存的對(duì)象是?個(gè)?序的 鍵值對(duì) 集合.?個(gè)對(duì)象以左括號(hào) { 開始,右括號(hào) }結(jié)束。每個(gè)"鍵"后跟?個(gè)冒號(hào) :
,鍵值對(duì)使?逗號(hào) , 分隔 - 數(shù)組: 中括號(hào) [ ] 保存的數(shù)組是值(value)的有序集合.?個(gè)數(shù)組以左中括號(hào) [ 開始,右中括號(hào) ] 結(jié)束,值之間使?逗號(hào) , 分隔。
??JSON字符串和Java對(duì)象互轉(zhuǎn)
JSON本質(zhì)上是?個(gè)字符串,通過?本來(lái)存儲(chǔ)和描述數(shù)據(jù)
Spring MVC框架也集成了JSON的轉(zhuǎn)換?具,我們可以直接使?,來(lái)完成JSON字符串和Java對(duì)象的互轉(zhuǎn)
??JSON的優(yōu)點(diǎn)
-
簡(jiǎn)單易?:語(yǔ)法簡(jiǎn)單,易于理解和編寫,可以快速地進(jìn)?數(shù)據(jù)交換
-
跨平臺(tái)?持:JSON可以被多種編程語(yǔ)?解析和?成,可以在不同的平臺(tái)和語(yǔ)?之間進(jìn)?數(shù)據(jù)交換和傳輸
-
輕量級(jí):相較于XML格式,JSON數(shù)據(jù)格式更加輕量級(jí),傳輸數(shù)據(jù)時(shí)占?帶寬較?,可以提?數(shù)據(jù)傳輸速度
-
易于擴(kuò)展:JSON的數(shù)據(jù)結(jié)構(gòu)靈活,?持嵌套對(duì)象和數(shù)組等復(fù)雜的數(shù)據(jù)結(jié)構(gòu),便于擴(kuò)展和使?
-
安全性:JSON數(shù)據(jù)格式是?種純?本格式,不包含可執(zhí)?代碼,不會(huì)執(zhí)?惡意代碼,因此具有較?的安全性
基于以上特點(diǎn),JSON在Web應(yīng)?程序中被?泛使?,如前后端數(shù)據(jù)交互、API接?數(shù)據(jù)傳輸?shù)?/p>
??傳遞JSON對(duì)象
接收J(rèn)SON對(duì)象,需要使? @RequestBody 注解
RequestBody:請(qǐng)求正?,意思是這個(gè)注解作?在請(qǐng)求正?的數(shù)據(jù)綁定,請(qǐng)求參數(shù)必須在寫在請(qǐng)求正?中
@RequestMapping("test9")
public String test9(@RequestBody Person person) {
return "接收到的參數(shù)名為:" + person.toString();
}
??獲取URL中參數(shù)@PathVariable
path variable:路徑變量
和字?表達(dá)的意思?樣,這個(gè)注解主要作?在請(qǐng)求URL路徑上的數(shù)據(jù)綁定
@RequestMapping("/test10/{id}/{name}")
public String test10(@PathVariable Integer id, @PathVariable("name") String userName){
return "解析參數(shù)id:"+id+",name:"+userName;
}
注意:
-
如果?法參數(shù)名稱和需要綁定的URL中的變量名稱?致時(shí),可以簡(jiǎn)寫,不?給@PathVariable的屬性賦值,如上述例?中的id變量
-
如果?法參數(shù)名稱和需要綁定的URL中的變量名稱不?致時(shí),需要@PathVariable的屬性value賦值,如上述例?中的userName變量
??上傳文件@RequestPart
代碼實(shí)現(xiàn)如下:
@RequestMapping("/test11")
public String getfile(@RequestPart("file") MultipartFile file) throws IOException {
//獲取?件名稱
String fileName = file.getOriginalFilename();
//?件上傳到指定路徑
file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
return "接收到?件名稱為: "+fileName;
}
??獲取Cooki/Session
由于這部分內(nèi)容較多,博主單獨(dú)寫了出來(lái)。鏈接如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-848720.html
??獲取Header
??傳統(tǒng)獲取 header
@RequestMapping("/test17")
public String test17(HttpServletRequest request, HttpServletResponse response) {
String userAgent = request.getHeader("User-Agent");
return "userAgent:"+userAgent;
}
??簡(jiǎn)潔獲取header
@RequestMapping("/test18")
public String test18(@RequestHeader("User-Agent") String userAgent) {
return "userAgent:"+userAgent;
}
?總結(jié)
感謝大家的閱讀,希望得到大家的批評(píng)指正,和大家一起進(jìn)步,與君共勉!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-848720.html
到了這里,關(guān)于【Java EE】Spring請(qǐng)求如何傳遞參數(shù)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!