Spring請求傳遞參數(shù)的解決方案
??序言
訪問不同的路徑,就是發(fā)送不同的請求.在發(fā)送請求時,可能會帶?些參數(shù),所以我們在學習Spring的請求時,主要是學習如何傳遞參數(shù)到后端以及后端如何接收.
下面博主會對傳遞參數(shù)進行一個詳解,咱們主要是使?瀏覽器和Postman來模擬
??傳遞單個參數(shù)
比如博主寫了以下程序
@RequestMapping("pt") @RestController public class Test_1_12 { @RequestMapping("test1") public String test1(String name) { return "接收到的參數(shù)名為:" + name; } }
當我們運行后,用瀏覽器進行訪問
http://127.0.0.1:8080/pt/test1?name=遇事問春風
訪問結(jié)果如下:
注意:
如果參數(shù)名不一致,獲取不到參數(shù),默認沒有傳參,默認值為null
@RequestMapping("test2") public String test2(Integer year) { return "接收到的參數(shù)名為:" + year; }
如果參數(shù)類型不?致,是會進行報錯的
@RequestMapping("test3") public String test3(int year) { return "接收到的參數(shù)名為:" + year; }
如果使?基本類型來接收參數(shù)時,參數(shù)必須傳(除boolean類型),否則會報500錯誤
@RequestMapping("test4") public String test4(String name,Integer year) { return "接收到的參數(shù)名為:" + name + " " + year; }
日志中也會進行報錯。
建議使用包裝類?。?!
??傳遞多個參數(shù)
與傳遞單個參數(shù)一樣
不同的是當有多個參數(shù)時,前后端進?參數(shù)匹配時,是以參數(shù)的名稱進?匹配的,因此參數(shù)的位置是不影響后端獲取參數(shù)的結(jié)果
@RequestMapping("test4") public String test4(String name,Integer year) { return "接收到的參數(shù)名為:" + name + " " + year; }
??傳遞對象
如果參數(shù)?較多時,?法聲明就需要有很多形參.并且后續(xù)每次新增?個參數(shù),也需要修改?法聲明.
我們不妨把這些參數(shù)封裝為?個對象.
Spring MVC也可以?動實現(xiàn)對象參數(shù)的賦值,?如Person對象
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會根據(jù)參數(shù)名稱?動綁定到對象的各個屬性上,如果某個屬性未傳遞,則賦值為null(基本類型則賦值為默認初識值,?如int類型的屬性,會被賦值為0)
??后端參數(shù)重命名(后端參數(shù)映射)
某些特殊的情況下,前端傳遞的參數(shù)key和我們后端接收的key可以不?致,?如前端傳遞了?個time給后端,?后端是使?createtime字段來接收的,這樣就會出現(xiàn)參數(shù)接收不到的情況,如果出現(xiàn)這種情況,我們就可以使? @RequestParam 來重命名前后端的參數(shù)值.
@RequestMapping("test6") public String test6(@RequestParam("time") String createtime) { return "接收到的參數(shù)名為:" + createtime; }
注意:
使? @RequestParam 進?參數(shù)重命名時,請求參數(shù)只能和@RequestParam 聲明的名稱?致,才能進?參數(shù)綁定和賦值.
使? @RequestParam 進?參數(shù)重命名時,參數(shù)就變成了必傳參數(shù)
如果我們不想讓他變成必傳參數(shù),我們可以通過設置@RequestParam 中的 required=false (默認為true,必傳)來避免不傳遞時報錯
@RequestMapping("test6") public String test6(@RequestParam(value = "time",required = false) String createtime) { return "接收到的參數(shù)名為:" + createtime; }
??傳遞數(shù)組
Spring MVC 可以?動綁定數(shù)組參數(shù)的賦值
@RequestMapping("test7") public String test7(String[] names) { return "接收到的參數(shù)名為:" + Arrays.toString(names); }
數(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ù)組類似,同?個請求參數(shù)名有為多個
不同的時需要使? @RequestParam 綁定參數(shù)關系
傳參方式與上述數(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對象表?法】
JSON是?種輕量級的數(shù)據(jù)交互格式.它基于ECMAScript(歐洲計算機協(xié)會制定的js規(guī)范)的?個?集,采?完全獨?于編程語?的?本格式來存儲和表?數(shù)據(jù)。
簡單來說:JSON就是?種數(shù)據(jù)格式,有??的格式和語法,使??本表??個對象或數(shù)組的信息,因此JSON本質(zhì)是字符串.
主要負責在不同的語?中數(shù)據(jù)傳遞和交換
??JSON的語法
數(shù)據(jù)在 鍵值對(Key/Value) 中
數(shù)據(jù)由逗號 , 分隔
對象? {} 表?
數(shù)組? [] 表?
值可以為對象,也可以為數(shù)組,數(shù)組中可以包含多個對象
??JSON的兩種結(jié)構(gòu)
- 對象:?括號 {} 保存的對象是?個?序的 鍵值對 集合.?個對象以左括號 { 開始,右括號 }結(jié)束。每個"鍵"后跟?個冒號 : ,鍵值對使?逗號 , 分隔
- 數(shù)組: 中括號 [ ] 保存的數(shù)組是值(value)的有序集合.?個數(shù)組以左中括號 [ 開始,右中括號 ] 結(jié)束,值之間使?逗號 , 分隔。
??JSON字符串和Java對象互轉(zhuǎn)
JSON本質(zhì)上是?個字符串,通過?本來存儲和描述數(shù)據(jù)
Spring MVC框架也集成了JSON的轉(zhuǎn)換?具,我們可以直接使?,來完成JSON字符串和Java對象的互轉(zhuǎn)
??JSON的優(yōu)點
- 簡單易?:語法簡單,易于理解和編寫,可以快速地進?數(shù)據(jù)交換
- 跨平臺?持:JSON可以被多種編程語?解析和?成,可以在不同的平臺和語?之間進?數(shù)據(jù)交換和傳輸
- 輕量級:相較于XML格式,JSON數(shù)據(jù)格式更加輕量級,傳輸數(shù)據(jù)時占?帶寬較?,可以提?數(shù)據(jù)傳輸速度
- 易于擴展:JSON的數(shù)據(jù)結(jié)構(gòu)靈活,?持嵌套對象和數(shù)組等復雜的數(shù)據(jù)結(jié)構(gòu),便于擴展和使?
- 安全性:JSON數(shù)據(jù)格式是?種純?本格式,不包含可執(zhí)?代碼,不會執(zhí)?惡意代碼,因此具有較?的安全性
基于以上特點,JSON在Web應?程序中被?泛使?,如前后端數(shù)據(jù)交互、API接?數(shù)據(jù)傳輸?shù)?/p>
??傳遞JSON對象
接收JSON對象,需要使? @RequestBody 注解
RequestBody:請求正?,意思是這個注解作?在請求正?的數(shù)據(jù)綁定,請求參數(shù)必須在寫在請求正?中
@RequestMapping("test9") public String test9(@RequestBody Person person) { return "接收到的參數(shù)名為:" + person.toString(); }
我們使用使?Postman來發(fā)送json請求參數(shù)
??獲取URL中參數(shù)@PathVariable
path variable:路徑變量
和字?表達的意思?樣,這個注解主要作?在請求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中的變量名稱?致時,可以簡寫,不?給@PathVariable的屬性賦值,如上述例?中的id變量
- 如果?法參數(shù)名稱和需要綁定的URL中的變量名稱不?致時,需要@PathVariable的屬性value賦值,如上述例?中的userName變量
??上傳?件@RequestPart
代碼實現(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; }
我們這里使用Postman發(fā)送請求
我們到相應路徑進行查看是否上穿成功
??獲取Cooki/Session
由于這部分內(nèi)容較多,博主單獨寫了出來。鏈接如下:
??獲取Header
獲取Header也分為兩種方式
??傳統(tǒng)獲取 header
@RequestMapping("/test17") public String test17(HttpServletRequest request, HttpServletResponse response) { String userAgent = request.getHeader("User-Agent"); return "userAgent:"+userAgent; }
??簡潔獲取header
@RequestMapping("/test18") public String test18(@RequestHeader("User-Agent") String userAgent) { return "userAgent:"+userAgent; }
??結(jié)果展示
傳統(tǒng)獲取
簡潔獲取
?總結(jié)
到此這篇關于 Spring請求如何傳遞參數(shù)詳解的文章就介紹到這了,更多相關 Spring請求傳遞參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot中TypeExcludeFilter的作用及使用方式
在SpringBoot應用程序中,TypeExcludeFilter通過過濾特定類型的組件,使它們不被自動掃描和注冊為bean,這在排除不必要的組件或特定實現(xiàn)類時非常有用,通過創(chuàng)建自定義過濾器并注冊到spring.factories文件中,我們可以在應用啟動時生效2025-01-01idea整合deepseek實現(xiàn)AI輔助編程的流程步驟
文章介紹了如何在IntelliJ IDEA中整合DeepSeek平臺實現(xiàn)AI輔助編程,步驟包括安裝CodeGPT插件、注冊DeepSeek開發(fā)者賬號、配置API密鑰以及設置API信息,需要的朋友可以參考下2025-02-02