Spring MVC參數綁定終極手冊:單多參對象集合JSON文件上傳精講

我們通過瀏覽器訪問不同的路徑,就是在發送不同的請求,在發送請求時,可能會帶一些參數,本文將介紹了Spring MVC中處理不同請求參數的多種方式

一、傳遞單個參數

接收單個參數,在Spring MVC中直接用方法中的參數就可以,如以下代碼:

@RequestMapping("Param")
@RestController
public class ParamController {@RequestMapping("a1")public String tex1(String string){return "接收到參數:"+string;}
}

我們使用Postman傳參后,瀏覽器訪問127.0.0.1:8080/Param/a1?string=Spring

Spring MVC會根據方法,找到對應的參數,賦值給方法,參數不一致,是獲取不到參數,即為null(包裝類型)

注意:

使用基本類型來接收參數時,參數必須傳(除boolean類型),否則報500錯誤;類型不匹配,會報400錯誤(此處400/500等都是狀態碼,其他篇章會涉及講解)

1.1、正常傳遞參數
@RequestMapping("a2")public Object text2(int a){return "接收到參數a:"+a;}

通過Fiddler觀察請求和響應, HTTP響應狀態碼為200(正常)

1.2、不傳a參數

通過Fiddler觀察請求和響應, HTTP響應狀態碼為500(服務器異常)

嘗試觀察程序的錯誤日志,并解決:

可選的整型參數“a”存在,但由于被聲明為基本類型,所以無法轉換為 null 值。建議將其聲明為對應基本類型的對象包裝器。

1.3、傳遞參數類型不匹配

對于包裝類型, 如果不傳對應參數,Spring 接收到的數據則為null。所以開發中,對于參數可能為空的數據,建議使用包裝類型

二、傳遞多個參數

和傳輸一個參數一樣,直接使用方法的參數接收即可

@RestController
public class ParamController {@RequestMapping("Param")public String Demo1(String name,String age){return "接收到參數name: "+name+" ,age: "+age;}
}

使用瀏覽器發送請求并傳參:127.0.0.1:8080/Param?name=小奧奇&age=8

可以發現,后端程序是正確拿到nameage參數的值

當有多個參數時,前后端是以參數的名稱進行參數匹配的,但是參數的位置是不影響后端獲取參數的結果

三、傳遞對象

如果需要傳遞的參數較多時,使用方法傳參就要有很多形參,并且后續每增加一個參數,也要修改方法的聲明,比較麻煩~,在此情況下我們便可以把這些參數封裝成一個對象

Spring MVC 也可以自動實現對象參數的賦值,我們先創建一個Cat對象

public class Cat {private String name;private int age;private String hobby;public String getName() {return name;}public int getAge() {return age;}public String getHobby() {return hobby;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public void setHobby(String hobby) {this.hobby = hobby;}@Overridepublic String toString() {return "Cat{" +"name='" + name + ''' +", age=" + age +", hobby='" + hobby + ''' +'}';}
}

實現傳遞對象的方法

  @RequestMapping("Cat")public Object Cat(Cat cat){return cat.toString();}

使用瀏覽器發送請求并傳參:127.0.0.1:8080/Cat?name=咪咪&age=1&hobby=喜歡吃小魚干

正好對應我們Cat類中的三個成員變量,此過程中 Spring 會根據參數名稱自動綁定到對象的各個屬性上,如果屬性未傳遞,則會賦值位null(基本類型會被賦值為默認初始值,比如 int 賦值 0)

四、后端參數重命名(后端參數映射)

在一些情況下,前端傳遞的參數 key 和我們后端接受的 key 可以不一致,比如前端想加密URL中的信息,會使用 p 傳遞給后端,后端是使用 password 字段來接收的(保證可讀性,不然后續維護時,不知道 p 到底是什么),如果出現這種情況,我們可以使用 @RequestParam 來重命名前后端的參數值

 @RequestMapping("A1")public String A1(@RequestParam("p") String password){return "接收參數: password:"+password;}

該注解表示從前端接收到 p 賦值給 password

那如果我們直接傳遞給后端的參數 password 呢?

2025-05-30T22:37:36.378+08:00 WARN 27268 — [SpringDemo1] [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter ‘p’ for method parameter type String is not present]

控制臺打印日志顯示:請求參數 p 不存在

那既然是 String 引用類型,我們嘗試不傳參數試試,會不會得到 null ~~

我們發現,當不傳參數時,直接報客戶端錯誤了,因為當我們使用該注解時,這個參數就變成必傳參數了,我們點進該注解的源碼中:

表示:若請求缺失此參數,會拋出**MissingServletRequestParameterException**,返回 HTTP 400(Bad Request) 錯誤,我們可以通過設置該 required 使該參數為非必傳參數

@RequestMapping("A1")public String A1(@RequestParam(value = "p",required = false) String password){return "接收參數: password:"+password;}

required 設置為 false ,再次空傳參數得到:

結論:

使用 @RequestParam 進行參數重命名時,請求參數只能和 @RequestParam 聲明的名稱一致,才能進行參數綁定和賦值

使用 @RequestParam 進行參數重命名時, 參數就變成了必傳參數

五、傳遞數組

@RequestMapping("A2")public String A2(String[] arr){return "接收參數:arr:"+ Arrays.toString(arr);}

和傳遞引用類型一樣,直接把數組當成參數,那數組包含多個元素,我們該如何傳遞呢?

此外,我們還可以直接使用方式二在一行中傳遞多個元素:

可以看到,方式二每個元素是以逗號分隔的,但是如果我們本來就要傳遞一個逗號呢?

那么逗號就會轉義為%2c

六、傳遞集合

集合參數:和數組類似,同一個請求中出現多個同名參數,需要使用@RequestParam綁定參數關系,Spring自動將其值收集到一個集合中

@RequestMapping("A1")public String A1(@RequestParam List<Integer> list){return "接收參數:"+list;}

七、傳遞JSON數據

7.1、概念

JSON概念:JSON 全稱為 JavaScript Object Notation(JavaScript 對象表示法),是一種輕量級的數據交互格式

簡單來說:JSON就是客戶端和服務端進行交互的一種數據格式有自己的格式和語法使用文本表示對一個對象或數組的信息,因此本質上是字符串,主要負責在不同的語言中數據傳遞和交換

7.2、JSON語法

還可以壓縮為:

{“name”:“Json.CN”,“url”:“http://www.json.cn”,“page”:88,“isNonProfit”:true,“address”:{“street”:“科技園路.”,“city”:“江蘇蘇州”,“country”:“中國”},“links”:[{“name”:“Google”,“url”:“http://www.google.com”},{“name”:“Baidu”,“url”:“http://www.baidu.com”},{“name”:“SoSo”,“url”:“http://www.SoSo.com”}]}

我們可以使用在線JSON格式化工具來進行校驗和書寫:https://www.bejson.com/

7.3、JSON的優點:
  1. 簡單易用:語法簡單,易于理解和編寫,可以快速進行數據交換。
  2. 跨平臺支持:JSON可以被多種編程語言解析和生成,可以在不同的平臺和語言之間進行數據交換和傳輸。
  3. 輕量級:相較于XML格式,JSON數據格式更加輕量級,傳輸數據時占用帶寬較小,可以提高數據傳輸速度。
  4. 易于擴展:JSON的數據結構靈活,支持嵌套對象和數組等復雜的數據結構,便于擴展和使用。
  5. 安全性:JSON數據格式是一種純文本格式,不包含可執行代碼,不會執行惡意代碼,因此具有較高的安全性。
7.4、JSON字符串和Java對象互轉

Spring MVC框架集成了JSON的轉換工具,我們可以直接使用來完成兩者的互轉

本質上是 jackson-databind 提供的功能,SpringMVC框架中已經把該工具包引入了進來,咱們直接使用即可,如果脫離SpringMVC使用,需要引入相關依賴

使用 ObjectMapper 對象提供的兩個方法,可以完成對象和JSON字符串的互轉 writeValueAsString: 把對象轉為JSON字符串 readValue: 把字符串轉為對象

public class JSONText {@Testpublic void JsontoJava() throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();//定義一個JSON字符串String s="{"name":"咪咪","age":1,"color":"blue"}";//轉對象Animals cat=mapper.readValue(s,Animals.class);System.out.println(cat.toString());}@Testpublic void JavatoJson() throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();//創建Java對象Animals cat = new Animals();cat.setName("cat");cat.setAge(1);cat.setColor("blue");//轉換為JSONString str = mapper.writeValueAsString(cat);System.out.println(str);}
}
7.5、傳遞JSON對象

接收JSON對象,需要使用@RequestBody注解

RequestBody:請求正文,意思是這個注解作用在請求正文的數據綁定,請求參數必須寫在請求正文中

@RequestMapping("A3")public String A3(@RequestBody Animals animals){return animals.toString();}

我們再postman中傳入的是JSON格式的字符串,但在后端代碼中,Spring會把我們傳入的JSON字符串轉化成一個對象,我們就不用自己轉化為Java對象了,還可以對此對象進行操作:

@RequestMapping("A3")public String A3(@RequestBody Animals animals){System.out.println(animals.getColor());animals.color="彩虹色";return animals.toString();}

八、獲取URL中參數@PathVariable

這個注解主要作用在請求URL路徑上的數據綁定(默認傳遞參數寫在URL上,Spring MVC 就可以獲取到)

@RequestMapping("A4/{id}")public String A4(@PathVariable Integer id){return "獲取id: "+id;}

我們還可以傳遞兩個參數:

@RequestMapping("A4/{id}/{age}")public String A4(@PathVariable Integer id,@PathVariable Integer age) {return "獲取id: "+id+",age: "+age;}

這兩個也默認為必傳參數,如果我們只傳遞一個參數,會發生客戶端錯誤,那么我們是否可以設置為非必傳參數

答案是:理論上可以,但是我們若對改路徑傳一個參數,那么這個參數是id還是age****Spring也不知道,所以參數是必傳的,另外我們可以重命名(此處不再演示)

九、上傳文件@RequestPart

 @RequestMapping("A5")public String A5(MultipartFile file) {System.out.println(file.getOriginalFilename());return "文件獲取成功";}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85982.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

synchronized 做了哪些優化?

Java 中的 synchronized 關鍵字是保證線程安全的基本機制&#xff0c;隨著 JVM 的發展&#xff0c;它經歷了多次優化以提高性能。 1. 鎖升級機制&#xff08;鎖膨脹&#xff09; JDK 1.6 引入了偏向鎖→輕量級鎖→重量級鎖的升級機制&#xff0c;避免了一開始就使用重量級鎖&…

三甲醫院AI醫療樣本數據集分類與收集全流程節點分析(下)

3.3 典型案例分析 —— 以某三甲醫院為例 為了更深入地了解三甲醫院 AI 醫療樣本數據收集的實際情況,本研究選取了具有代表性的某三甲醫院作為案例進行詳細分析。該醫院作為區域醫療中心,在醫療技術、設備和人才方面具有顯著優勢,同時在醫療信息化建設和 AI 應用方面也進行…

設置程序開機自動啟動

在Windows系統中&#xff0c;有幾種方法可以將程序設置為開機自動啟動。下面我將介紹最常用的三種方法&#xff0c;并提供一個C#實現示例。 方法一&#xff1a;使用啟動文件夾&#xff08;最簡單&#xff09; 按下 Win R 鍵打開運行對話框 輸入 shell:startup 并回車 將你的…

多源異構數據接入與實時分析:衡石科技的技術突破

在數字化轉型的浪潮中&#xff0c;企業每天產生的數據量呈指數級增長。這些數據來自CRM系統、IoT設備、日志文件、社交媒體、交易平臺等眾多源頭&#xff0c;格式各異、結構混亂、流速不一。傳統的數據處理方式如同在無數孤立的島嶼間劃著小船傳遞信息&#xff0c;效率低下且無…

JVM——Synchronized:同步鎖的原理及應用

引入 在多線程編程的世界里&#xff0c;共享資源的訪問控制就像一場精心設計的交通管制&#xff0c;而Synchronized作為Java并發編程的基礎同步機制&#xff0c;扮演著"交通警察"的關鍵角色。 并發編程的核心矛盾 當多個線程同時訪問共享資源時&#xff0c;"…

跟著AI學習C# Day26

&#x1f4c5; Day 26&#xff1a;C# 異步編程進階 ? 學習目標&#xff1a; 深入理解 async/await 的底層機制&#xff1b;掌握 ConfigureAwait(false) 的作用與使用場景&#xff1b;避免異步死鎖&#xff0c;理解同步上下文&#xff08;Synchronization Context&#xff09…

Scrapy | 通過爬取豆瓣Top250電影信息來學習在中間件中應用隨機請求頭和代理ip

中間件的使用 1.scrapyl中間件的分類和作用1.1 scrapy中間件的分類1.2 scrapy中間的作用:預處理request和response對象2.下載中間件的使用方法:3.定義實現隨機User-Agent的下載中間件3.1 實戰:爬取豆瓣Top250電影信息3.2 中間件使用實現隨機User-Agent4. 代理ip的使用4.1思路…

【深度學習】深度學習入門:從理論到實踐的全面指南

深度學習入門&#xff1a;從理論到實踐的全面指南 深度學習&#xff1a;開啟人工智能新時代的鑰匙一、深度學習的廣泛應用場景1.1 改變生活的深度學習應用1.2 行業變革案例深度解析案例一&#xff1a;深度學習檢測皮膚癌案例二&#xff1a;移動端OCR技術突破案例三&#xff1a;…

MySQL 數據庫操作完整指南

MySQL 數據庫操作完整指南 目錄 創建數據庫 連接數據庫 創建表 約束詳解 插入數據 查詢數據 多表聯合查詢 連接查詢 高級查詢 更新數據 刪除數據 視圖詳解 存儲過程詳解 函數詳解 觸發器 事務處理 索引優化 安全性管理 備份和恢復 性能優化 刪除表和數據庫 1. 創建數據庫 基…

Java面試復習:面向對象編程、Java 8新特性與Spring

Java面試復習&#xff1a;面向對象編程、Java 8新特性與Spring 面向對象編程 概念解析&#xff1a;面向對象編程&#xff08;OOP&#xff09;是將現實世界中的概念抽象為軟件模型的編程范式&#xff0c;包括封裝、繼承和多態。 核心原理&#xff1a; 封裝&#xff1a;通過訪…

藍牙數據通訊,實現內網電腦訪問外網電腦

最近突然想到了一個可以繞開單位安全管控軟件&#xff0c;讓單位內部辦公電腦連上外網的方法。大概是這個樣子&#xff0c;讓單位辦公電腦與自己的外網電腦進行藍牙配對&#xff0c;然后用配對成功的藍牙進行網絡數據交互。這里大家可能會想用一下藍牙的網絡共享功能&#xff0…

硬件面經-具身機器人通用技術要求

目錄 簡介 場景 技術面試 設計知識點 總結 簡介 最近機器人特別的火。所以收集了一些關于機器人的面試及要求 場景 目前具身機器人賽道可謂是十分火熱,全國大大小小崛起了幾十家具身機器人公司,國外比較出名的有波士頓動力,特斯拉等,國內目前比較火的就是宇樹,眾擎…

DeepSeek生成HTML5圖片拼接工具

讓DeepSeek生成一個HTML5圖片拼接工具&#xff0c;給的提示詞如下 提示詞(prompt) 幫我生成一個可以將兩張圖片拼接到一起的程序 支持橫向拼接和豎向拼接&#xff0c;可以用html5實現功能嗎&#xff1f; DeepSeek大概20秒左右就做好了&#xff0c;而且像這么簡單的功能的話也沒…

Java面試復習指南:Java基礎、面向對象編程與并發編程

Java面試復習指南&#xff1a;Java基礎、面向對象編程與并發編程 1. Java基礎 概念解析: Java是一種面向對象的編程語言&#xff0c;具有跨平臺的特性。 核心原理: JVM負責Java程序的跨平臺運行&#xff0c;通過字節碼來實現。 高頻面試問題: Java如何實現跨平臺&#xff…

LeeCode2566替換一個數字后的最大差值

項目場景&#xff1a; 給你一個整數 num 。你知道 Danny Mittal 會偷偷將 0 到 9 中的一個數字 替換 成另一個數字。 請你返回將 num 中 恰好一個 數字進行替換后&#xff0c;得到的最大值和最小值的差為多少。 注意&#xff1a; 當 Danny 將一個數字 d1 替換成另一個數字 …

李宏毅2025《機器學習》第三講-AI的腦科學

在之前的課程中探討了如何利用大模型構建AI Agent,本科將暫時放下應用層面的探索,拿起“手術刀”和“顯微鏡”,深入剖析LLM的“大腦”,帶您踏上一場“AI腦神經科學”的旅程。課程不討論模型的訓練過程,而是假設我們擁有一個已經訓練好的、功能完備的LLM。我們的目標是:理…

CVPR 2025 | 微米級光影CT精度!復旦騰訊優圖開源Real-IAD D3數據集

【導讀】 本文介紹了復旦聯合騰訊優圖發布高精度多模態數據集Real-IAD D&#xff0c;并基于此數據集提出了一種創新的多模態融合檢測方法&#xff0c;數據集已被CVPR 2025收錄&#xff0c;并開源。>>更多資訊可加入CV技術群獲取了解哦~ 目錄 一、Real-IAD D的創新之處…

解決mysql左連接加where就不會保留左表中的全部數據的問題

在SQL中使用MySQL的LEFT JOIN操作時,如果加入了WHERE條件,確實會影響結果集的完整性,特別是如果你在WHERE條件中使用了JOIN的另一張表中的字段作為過濾條件。這是因為當你在WHERE子句中加入了對JOIN另一張表的過濾條件時,實際上你是在執行一個INNER JOIN(內連接)而非LEFT…

算法與數據結構:動態規劃DP

文章目錄 動態規劃算法全面解析一、核心思想與基本概念二、動態規劃與其他算法的區別三、動態規劃的解題步驟四、經典案例解析1. **斐波那契數列&#xff08;Fibonacci&#xff09;**2. **0-1背包問題&#xff08;0-1 Knapsack&#xff09;**3. **最長公共子序列&#xff08;LC…

Coilcraft電感上的橫線是什么意思?電感有方向么?

通常我們會認為電容、電感、電阻這幾類無源器件沒有方向性&#xff0c;在布局和貼片時可以任意方向放置&#xff0c;也不會在PCB上增加絲印標識說明其方向。與此相互印證的是&#xff0c;電容表面無絲印&#xff0c;無法識別方向&#xff1b;電阻表面一般只有包含阻值大小的數字…