【SpringMVC】詳解參數傳遞與實戰指南


目錄

1.前言

2.正文

2.1基礎參數傳遞

2.1.1單參數

2.1.2多參數

2.2對象參數綁定

2.2.1自動封裝對象

2.2.2參數別名處理

2.3集合類型處理

2.3.1數組接收

2.3.2List集合接收

2.4JSON參數處理

2.4.1介紹JSON

2.4.2傳遞JSON參數

2.5RESTful風格參數

2.6文件上傳處理

2.7完整調試代碼

3.小結


1.前言

哈嘍大家好吖,在SpringMVC開發中,參數傳遞是開發者每天都要面對的核心問題。不同的業務場景需要采用不同的參數接收方式,合理的參數處理能大幅提升開發效率和代碼質量。本文將通過一個完整的RequestController案例,詳解10種常見參數傳遞方式,助你徹底掌握SpringMVC參數傳遞技巧。

2.正文

官方文檔:Spring Framework Documentation :: Spring Frameworkhttps://docs.spring.io/spring-framework/reference/

2.1基礎參數傳遞

2.1.1單參數

@RequestMapping("/r1")
public String r1(String keyword){return "接收參數:" + keyword;
}
  • 調用示例/request/r1?keyword=spring

  • 特點

    • 參數名與方法參數名嚴格匹配

    • 自動完成基本類型轉換(String→int等)

    • 若參數不存在會注入null

2.1.2多參數

@RequestMapping("r2")
public String r2(String name, int id){return "receive:" + name + id;
}
  • 調用示例/request/r2?name=Alice&id=1001

  • 注意事項

    • 基本類型參數不能為null(如int)

    • 推薦使用包裝類型Integer避免空指針異常

避免空指針:

@RequestMapping("r3")public String r3(Integer number){return "receive" + number;}

2.2對象參數綁定

2.2.1自動封裝對象

@RequestMapping("r4")
public String r4(student s1){return "receive" + s1.toString();
}
  • 調用示例/request/r4?id=1002&name=Bob

  • 實現機制

    1. Spring自動創建Student實例

    2. 通過setter方法進行屬性注入

    3. 支持嵌套對象屬性綁定

2.2.2參數別名處理

@RequestMapping("/r5")
public String r5(@RequestParam(value = "n", required = false)String name){return "receive" + name;
}
  • 注解說明

    • value:指定參數別名

    • required:是否必須參數(默認true)

    • defaultValue:默認值設置


2.3集合類型處理

2.3.1數組接收

@RequestMapping("/r6")
public String r6(String[] array){return "receive" + Arrays.toString(array);
}
  • 調用方式

    • /request/r6?array=1&array=2

    • /request/r6?array=1,2,3

2.3.2List集合接收

@RequestMapping("/r7")
public String r7(@RequestParam List<Integer> list){return "receive:" + list;
}
  • 特別注意

    • 必須使用@RequestParam注解

    • 禁止使用ArrayList等具體實現類

    • 推薦使用包裝類型避免轉型異常

2.4JSON參數處理

2.4.1介紹JSON

JSON(JavaScript Object Notation,JavaScript對象表示法)是一種輕量級的數據交換格式,易于人閱讀和編寫,同時也易于機器解析和生成。它基于純文本,使用Unicode編碼,具有廣泛的兼容性和靈活性,常用于網絡應用之間的數據傳輸。


JSON格式以鍵值對的形式組織數據,支持兩種主要的數據結構:

對象(Object)

  • 一個無序的鍵值對集合,用大括號“{}”括起來。

  • 鍵(Key)必須是字符串類型,值(Value)可以是字符串、數值、布爾值、數組、對象或null

  • 鍵與值之間用英文冒號“:”分隔,鍵值對之間用英文逗號“,”分隔。

  • 例如:

    {"name": "Kimi","age": 25,"isStudent": false,"hobbies": ["reading", "traveling"],"address": {"city": "Beijing","country": "China"}
    }

數組(Array)

  • 一個有序的值集合,用方括號“[]”括起來。

  • 數組中的值可以是任意類型,包括字符串、數值、布爾值、對象、數組或null

  • 數組中的值之間用英文逗號“,”分隔。

  • 例如:

    ["apple",123,true,null,{"key": "value"},[1, 2, 3]
    ]

在SpringMVC中,JSON參數的自動轉換依賴于HttpMessageConverter體系。當檢測到請求的Content-Typeapplication/json時,框架會使用MappingJackson2HttpMessageConverter進行數據綁定。

處理流程

  1. 前端發送JSON格式請求體

  2. DispatcherServlet選擇匹配的消息轉換器

  3. Jackson庫將JSON反序列化為Java對象

  4. 通過@RequestBody注入方法參數

2.4.2傳遞JSON參數

@RequestMapping("/r8")
public String r8(@RequestBody student student1){return student1.toString();
}
  • 請求要求

    • Content-Type必須為application/json

    • 需要Jackson依賴支持

    • 支持嵌套復雜對象解析

  • 請求示例

    {"id": 1003, "name": "Carol"}

2.5RESTful風格參數

@RequestMapping("/path/{pathid}")
public String r9(@PathVariable Integer pathid){return "獲取路徑id" + pathid;
}
  • 調用示例/request/path/1004

  • 最佳實踐

    • 適合資源定位場景

    • 支持正則表達式校驗

    • 可配合@GetMapping等注解使用

2.6文件上傳處理

@RequestMapping("/r10")
public String r10(MultipartFile file) throws IOException {file.transferTo(new File("D:\\桌面\\" + file.getOriginalFilename()));return "文件上傳成功";
}
  • 表單需設置enctype="multipart/form-data"

  • 支持多文件同時上傳

  • 注意文件存儲路徑權限問題

2.7完整調試代碼

package com.example.demo;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.List;class student{int id;String name;public student() {}public student(int id, String name) {this.id = id;this.name = name;}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;}@Overridepublic String toString() {return super.toString();}
}@RequestMapping("/request")
@Controller
@ResponseBody
public class RequestController {@RequestMapping("/r1")public String r1(String keyword){return "接收參數:" + keyword;}@RequestMapping("r2")public String r2(String name, int id){return "receive:" + name + id;}@RequestMapping("r3")public String r3(Integer number){return "receive" + number;}@RequestMapping("r4")public String r4(student s1){return "receive" + s1.toString();}//從前端接受參數n,賦值給name@RequestMapping("/r5")public String r5(@RequestParam(value = "n", required = false)String name){return "receive" + name;}//傳遞數組@RequestMapping("/r6")public String r6(String[] array){return "receive" + array.toString();}//傳遞集合@RequestMapping("/r7")public String r7(@RequestParam List<Integer> list){return "receive:" + list;}//傳遞json@RequestMapping("/r8")public String r8(@RequestBody student student1){return student1.toString();}//從URL中獲取參數@RequestMapping("/path/{pathid}")public String r9(@PathVariable Integer pathid){return "獲取路徑id" + pathid;}//上傳文件@RequestMapping("/r10")public String r10(MultipartFile file) throws IOException {System.out.println(file.getOriginalFilename());file.transferTo(new File("D:\\桌面\\" + file.getOriginalFilename()));return "文件上傳成功";}}

3.小結

今天的分享到這里就結束了,喜歡的小伙伴點點贊點點關注,你的支持就是對我最大的鼓勵,大家加油!

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

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

相關文章

mysql-窗口函數一

目錄 一、感受一下分組與窗口函數的區別 二、滑動窗口&#xff08;子窗口&#xff09;大小的確認 2.1 分組函數下order by使用 2.2 窗口子句 2.3 執行流程 三、函數使用 窗口函數需要mysql的版本大于等于8才行&#xff0c;可以先檢查一下自己的mysql版本是多少 select ve…

解決在Mac上無法使用“ll”命令

在 macOS 上&#xff0c;ll 命令是一個常見的別名&#xff0c;它通常是指向 ls -l 的。但是&#xff0c;如果你看到 zsh: command not found: ll&#xff0c;這意味著你當前的 zsh 配置中沒有設置 ll 作為別名。 解決方法&#xff1a; 1. 使用 ls -l 命令 如果只是想查看目錄…

GTA5(傳承/增強) 13980+真車 超跑 大型載具MOD整合包+最新GTA6大型地圖MOD 5月最新更新

1500超跑載具 1000普通超跑 1500真車超跑 各種軍載具1000 各種普通跑車 船舶 飛機 1000 人物1500 添加式led載具1000 超級英雄最新版 添加添加式武器MOD1000 添加地圖MOD500 添加超跑載具2000 當前共計1.2wMOD 4月2日更新 新增770menyoo地圖 當前共計12770 新增48款超級英雄最新…

初學Vue之記事本案例

初學Vue之記事本案例 案例功能需求相關Vue知識案例實現1.實現方法及代碼2.演示 案例收獲與總結 案例功能需求 基于Vue實現記事功能&#xff08;不通過原生JS實現&#xff09; 1.點擊保存按鈕將文本框的內容顯示在特定位置&#xff0c;且清空文本框內容 2.點擊清空按鈕&#x…

一個linux系統電腦,一個windows電腦,怎么實現某一個文件夾共享

下載Samba linux主機名字不能超過15個字符 sudo dnf install samba samba-client -y 創建共享文件夾 sudo mkdir /shared 配置文件 vim /etc/samba/smb.conf [shared] path /shared available yes valid users linux電腦用戶 read only no browsable yes p…

樹莓派5+edge-tts 語音合成并進行播放測試

簡介 Edge-TTS 是一個基于微軟 Edge 瀏覽器的開源文本轉語音(TTS)工具,主要用于將文本轉換為自然流暢的語音。它利用了微軟 Azure 的 TTS 技術,支持多種語言和聲音,同時具備高質量的語音合成能力。這里簡單演示在樹莓派中安裝該項目進行簡單測試。 開源倉庫地址:https:/…

多模態革命!拆解夸克AI相機技術架構:如何用視覺搜索重構信息交互?(附開源方案對比)

一、技術人必看&#xff1a;視覺搜索背后的多模態架構設計 夸克「拍照問夸克」功能絕非簡單的OCRQA拼接&#xff0c;而是一套多模態感知-推理-生成全鏈路系統&#xff0c;其技術棧值得開發者深挖&#xff1a; 視覺編碼器&#xff1a;基于Swin Transformer V2&#xff0c;支持4…

論文閱讀:2024 ICLR Workshop. A STRONGREJECT for Empty Jailbreaks

總目錄 大模型安全相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 A STRONGREJECT for Empty Jailbreaks 對空越獄的 StrongREJECT https://arxiv.org/pdf/2402.10260 https://github.com/dsbowen/strong_reject https://strong-reject.re…

AI生成Flutter UI代碼實踐(一)

之前的雜談中有提到目前的一些主流AI編程工具&#xff0c;比如Cursor&#xff0c;Copilot&#xff0c;Trea等。因為我是Android 開發&#xff0c;日常使用Android Studio&#xff0c;所以日常使用最多的還是Copilot&#xff0c;畢竟Github月月送我會員&#xff0c;白嫖還是挺香…

計網分層體系結構(包括OSI,IP,兩者對比和相關概念)

眾所周知&#xff0c;就像我們計算機領域中的任何東西一樣&#xff0c;計算機網絡也是個分層的體系結構&#xff0c;現代提出的結構就兩種——OSI和TCP/IP&#xff0c;我們先來剖析并對比一下這兩種模型&#xff0c;然后總結一下分層思想中的一些共性。 TCP/IP與OSI結構對比圖 …

面向對象的XML綜合練習

快遞包裹配送管理 需求描述 構建一個快遞包裹配送管理系統&#xff0c;完成以下操作&#xff1a; 記錄每個快遞包裹的信息&#xff0c;包括包裹編號、收件人姓名、收件地址和是否已配送。可以添加新的快遞包裹到系統中。標記某個包裹為已配送狀態。統計所有已配送和未配送的…

什么是鴻蒙南向開發?什么是北向開發?

文章目錄 鴻蒙南向開發 vs 北向開發&#xff1a;底層與生態的雙向賦能一、鴻蒙南向開發&#xff1a;連接硬件的底層基石二、鴻蒙北向開發&#xff1a;構建全場景應用生態三、南向與北向&#xff1a;互補與協同四、如何選擇開發方向?結語 鴻蒙南向開發 vs 北向開發&#xff1a;…

Linux常用命令27——userdel刪除用戶

在使用Linux或macOS日常開發中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;userdel命令來自英文詞組user delete的縮寫&#xff0c;其功能是刪除用戶信息。在Linux系統中&#xff0c;一切都是文件&#xff0c;用戶信息被保存到了/etc/passwd、/etc/shadow以及…

[藍橋杯 2021 省 AB] 砝碼稱重 Java

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[] w new int[n 1];int sum 0; // 所有砝碼重量之和for (int i 1; i < n; i) {w[i] sc.nextInt();sum w[i];}sc.close()…

今天的python練習題

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 晚上8點到的&#xff0c;還是會被感動到&#xff0c;有一位列車員同志在檢票期間&#xff0c;叫我到列車員專座位上去坐&#xff0c;我很感激他&#xff0c;溫暖人心&#xff0c;所以人間填我…

20250430在ubuntu14.04.6系統上查看系統實時網速

rootrootubuntu:~$ sudo apt-get install iftop 【不需要root權限】 rootrootubuntu:~$ sudo apt-get install nload rootrootubuntu:~$ sudo apt-get install vnstat 【失敗】 rootrootubuntu:~$ sudo apt-get install speedtest-cli rootrootubuntu:~$ sudo apt-get install …

字節一面:后端開發

前言 這是我字節一面的回憶錄&#xff0c;可能有些不全。 由于博主是Java面試Go崗&#xff0c;操作系統和計網問的還是比較多。 個人感覺字節很喜歡追問&#xff0c;博主被追問拷打的找不到北了&#xff0c;總結還是學的太淺了。 面試官給我的建議&#xff1a;再更深挖一些…

快速掌握大語言模型+向量數據庫_RAG實現

一、前言 結合前面掌握的vLLM部署Qwen7B模型、通過Embedding模型&#xff08;bdg-large-zh模型&#xff09;提取高質量作文內容并預先存儲到Milvus向量數據庫中&#xff0c;我們很容易實現RAG方案進一步提高寫作內容的生成質量。 本篇要實現的目標是&#xff1a;通過FlaskAPI…

【FreeRTOS-列表和列表項】

參照正點原子以及以下gitee筆記整理本博客&#xff0c;并將實驗結果附在文末。 https://gitee.com/xrbin/FreeRTOS_learning/tree/master 一、列表和列表項的簡介(熟悉) 1、什么是列表 答&#xff1a;列表是FreeRTOS中的一個數據結構&#xff0c;概念上和鏈表有點類似&#…