Spring?MVC??接受請求參數(shù)的方法
一、HTTP 請求 如何攜帶參數(shù)
在HTTP請求中攜帶參數(shù)的方式取決于你使用的請求方法。常見的HTTP方法有GET和POST,參數(shù)傳遞的方式也有所不同:
1. GET 方法
GET方法通常用于請求服務(wù)器發(fā)送資源,參數(shù)直接附加在URL之后,通過?分隔URL和參數(shù),多個(gè)參數(shù)之間用&連接。例如:
GET /search?query=網(wǎng)絡(luò)安全&sort=latest HTTP/1.1 Host: www.example.com
這里,URL是/search,參數(shù)有兩個(gè):
query=網(wǎng)絡(luò)安全sort=latest
2. POST 方法
POST方法通常用于提交數(shù)據(jù)到服務(wù)器。與GET方法不同,POST方法通常將參數(shù)包含在請求體中,不顯示在URL中(但是普通的參數(shù)也可以出現(xiàn)在URL中)。只有form 表單在post 請求中固定在 body、get 出現(xiàn)在url 中。這樣可以發(fā)送更大的數(shù)據(jù)量,也更安全。參數(shù)可以以不同的格式發(fā)送,常見的有:
表單數(shù)據(jù)(application/x-www-form-urlencoded)
數(shù)據(jù)以鍵值對形式發(fā)送,鍵值對之間用&分隔,鍵和值之間用=連接,類似于URL查詢字符串。例如:
POST /submit HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 27 username=alice&password=1234
JSON數(shù)據(jù)(application/json)
數(shù)據(jù)以JSON格式發(fā)送,適用于復(fù)雜結(jié)構(gòu)的數(shù)據(jù)交換。例如:
POST /api/data HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 47
{"username": "alice", "password": "1234"}雖然GET和POST是最常見的,但HTTP協(xié)議還支持其他方法,如PUT、DELETE等,這些方法也可以攜帶參數(shù),通常是在請求體中,格式可以是表單數(shù)據(jù)、JSON或其他MIME類型。
小技巧
- 使用GET方法時(shí),由于URL長度存在限制,不適合傳輸大量信息。
- 使用POST方法時(shí),可通過適當(dāng)?shù)?code>Content-Type頭部來控制數(shù)據(jù)的編碼方式。
二、Spring MVC 接受參數(shù)
在 Spring MVC 中,處理來自客戶端的參數(shù)有幾種常用的方式。Spring MVC 提供了靈活的方式來接收來自 HTTP 請求的參數(shù),并將其綁定到控制器方法的參數(shù)中。這些方法包括使用注解如 @RequestParam, @PathVariable, @RequestBody, 和 @ModelAttribute 等。下面是這些注解的基本使用方法:
1. 使用 @RequestParam
這個(gè)注解用于處理來自查詢字符串或表單數(shù)據(jù)的參數(shù)。例如,對于一個(gè) GET 請求,你可以這樣使用:
@GetMapping("/search")
public String search(@RequestParam("query") String query) {
// 使用 query 參數(shù)
return "Result for: " + query;
}如果你的參數(shù)名和方法的參數(shù)名相同,你還可以省略 @RequestParam 中的值:
@GetMapping("/search")
public String search(@RequestParam String query) {
return "Result for: " + query;
}如果參數(shù)?較多時(shí), ?法聲明就需要有很多形參. 并且后續(xù)每次新增?個(gè)參數(shù), 也需要修改?法聲明. 我們不妨把這些參數(shù)封裝為?個(gè)對象.
@Data
public class Person {
private int id;
private String name;
private String password;
}
@RequestMapping("/m3")
public Object method3(Person p){
return p.toString();
}2. 使用 @PathVariable
用于處理 REST 風(fēng)格的 URL 中的參數(shù),如:
@GetMapping("/users/{userId}")
public String getUser(@PathVariable("userId") Long userId) {
// 使用 userId 參數(shù)
return "User profile for ID: " + userId;
}如果變量名和參數(shù)名相同,也可以省略:
@GetMapping("/users/{userId}")
public String getUser(@PathVariable Long userId) {
return "User profile for ID: " + userId;
}3. 使用 @RequestBody
這個(gè)注解用于處理 JSON 或 XML 等請求體數(shù)據(jù)。通常與 POST 或 PUT 請求一起使用:
@PostMapping("/users")
public String addUser(@RequestBody User user) {
// 處理 user 對象
return "Added user with ID: " + user.getId();
}4. 使用 @ModelAttribute
用于綁定請求參數(shù)到一個(gè)模型對象,通常用于處理表單提交:
@PostMapping("/users/update")
public String updateUser(@ModelAttribute User user) {
// 更新 user 對象
return "Updated user with ID: " + user.getId();
}5.傳遞數(shù)組和集合
Spring MVC 可以?動綁定數(shù)組參數(shù)的賦值
@RequestMapping("/m5")
public String method5(String[] arrayParam) {
return Arrays.toString(arrayParam);
}集合參數(shù):和數(shù)組類似, 同?個(gè)請求參數(shù)名有為多個(gè), 且需要使? @RequestParam 綁定參數(shù)關(guān)系 默認(rèn)情況下,請求中參數(shù)名相同的多個(gè)值,是封裝到數(shù)組. 如果要封裝到集合,要使? @RequestParam 綁定參數(shù)關(guān)系
6.接受String 轉(zhuǎn)成 Json
Jackson 是在 Spring 框架中常用的 JSON 處理庫。要使用 Jackson 進(jìn)行 JSON 與字符串的互轉(zhuǎn),首先需要在你的項(xiàng)目中添加 Jackson 的依賴。如果你使用 Maven,可以添加如下依賴到你的 pom.xml 文件:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>在 Spring MVC 中,直接使用字符串來接收參數(shù)后再手動處理確實(shí)是一種可行的方法,尤其是在某些情況下,你可能想對接收到的數(shù)據(jù)進(jìn)行特殊處理,或者原始數(shù)據(jù)格式與你的業(yè)務(wù)邏輯需求不完全匹配時(shí)。這種方式提供了更大的靈活性,允許你在將數(shù)據(jù)轉(zhuǎn)換成 Java 對象之前,先進(jìn)行驗(yàn)證、清洗或者格式化。
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonUtil {
public static String toJson(Object obj) throws Exception {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(obj);
}
}
// 使用
Person person = new Person("Alice", 30);
String jsonString = JsonUtil.toJson(person);
System.out.println(jsonString);例如,如果你希望接收一個(gè) JSON 格式的請求體,但暫時(shí)不想將其自動綁定到一個(gè) Java 對象,你可以將請求體作為一個(gè)普通的字符串接收:
@PostMapping("/api/data")
public ResponseEntity<String> processData(@RequestBody String rawData) {
try {
// 手動解析 JSON 字符串
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(rawData);
// 假設(shè)我們需要處理 name 字段
String name = rootNode.path("name").asText();
// 進(jìn)行業(yè)務(wù)邏輯處理
return ResponseEntity.ok("Received name: " + name);
} catch (JsonProcessingException e) {
return ResponseEntity.badRequest().body("Invalid JSON");
}
}三、常見問題
在 Spring MVC 中,當(dāng)你使用基本數(shù)據(jù)類型(如 int, double, boolean 等)作為方法參數(shù)時(shí),確實(shí)可能遇到一些問題,尤其是涉及到參數(shù)可能不存在或可選的情況。這是因?yàn)榛緮?shù)據(jù)類型不能接受 null 值,而包裝類(如 Integer, Double, Boolean 等)可以接受 null 值。
假設(shè)你有一個(gè)使用基本數(shù)據(jù)類型參數(shù)的方法:
@GetMapping("/calculate")
public String calculate(@RequestParam("number") int number) {
// 使用 number 參數(shù)
return "Result: " + number * 2;
}如果 HTTP 請求沒有提供 number 參數(shù),Spring MVC 將嘗試將 null 轉(zhuǎn)換為基本類型 int,這將失敗并引發(fā)一個(gè)異常,因?yàn)榛绢愋筒荒芙邮?null 值。
解決方案
1.使用包裝類
更改參數(shù)為相應(yīng)的包裝類可以解決這個(gè)問題,因?yàn)榘b類可以接受 null 值:
@GetMapping("/calculate")
public String calculate(@RequestParam("number") Integer number) {
if (number == null) {
return "Number parameter is missing";
}
return "Result: " + number * 2;
}2.設(shè)置默認(rèn)值
另一個(gè)常用的解決方案是為 @RequestParam 設(shè)置一個(gè)默認(rèn)值,這樣如果請求中沒有提供該參數(shù),將使用默認(rèn)值:
@GetMapping("/calculate")
public String calculate(@RequestParam(value = "number", defaultValue = "0") int number) {
// 無需檢查 null,因?yàn)橐呀?jīng)有默認(rèn)值
return "Result: " + number * 2;
}在這個(gè)例子中,如果沒有提供 number 參數(shù),number 將默認(rèn)為 0。
3.設(shè)置 required 為 false
你也可以將 @RequestParam 的 required 屬性設(shè)置為 false,并使用包裝類來明確表明這個(gè)參數(shù)是可選的:
@GetMapping("/calculate")
public String calculate(@RequestParam(value = "number", required = false) Integer number) {
if (number == null) {
return "Number parameter is optional";
}
return "Result: " + number * 2;
}到此這篇關(guān)于Spring MVC 接受請求參數(shù)的文章就介紹到這了,更多相關(guān)Spring MVC 請求參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springmvc接口接收參數(shù)與請求參數(shù)格式的整理
- SpringMVC解析post請求參數(shù)詳解
- 使用SpringMVC 重寫、擴(kuò)展HttpServletRequest請求參數(shù)
- SpringMvc接受請求參數(shù)的幾種情況演示
- 詳解在Spring MVC或Spring Boot中使用Filter打印請求參數(shù)問題
- Spring MVC請求參數(shù)與響應(yīng)結(jié)果全局加密和解密詳解
- 快速解決SpringMVC @RequestBody 用map接收請求參數(shù)的問題
- 學(xué)習(xí)SpringMVC——如何獲取請求參數(shù)詳解
相關(guān)文章
springboot后端如何實(shí)現(xiàn)攜帶token登陸
這篇文章主要介紹了springboot后端如何實(shí)現(xiàn)攜帶token登陸,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
詳解Java中l(wèi)ist,set,map的遍歷與增強(qiáng)for循環(huán)
這篇文章主要介紹了詳解Java中l(wèi)ist,set,map的遍歷與增強(qiáng)for循環(huán)的相關(guān)資料,需要的朋友可以參考下2017-02-02
基于SSM+Shiro+Bootstrap實(shí)現(xiàn)用戶權(quán)限管理系統(tǒng)
這篇文章主要介紹了基于SSM+Shiro實(shí)現(xiàn)一個(gè)用戶權(quán)限管理系統(tǒng),每位用戶只可訪問指定的頁面,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,快跟隨小編一起學(xué)習(xí)吧2021-12-12
SpringCloud實(shí)現(xiàn)SSO 單點(diǎn)登錄的示例代碼
作為分布式項(xiàng)目,單點(diǎn)登錄是必不可少的,這篇文章主要介紹了SpringCloud實(shí)現(xiàn)SSO 單點(diǎn)登錄的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2019-01-01
Struts2實(shí)現(xiàn)自定義攔截器的三種方式詳解
這篇文章主要介紹了Struts2實(shí)現(xiàn)自定義攔截器的三種方式詳解,一些與系統(tǒng)邏輯相關(guān)的通用功能如權(quán)限的控制和用戶登錄控制等,需要通過自定義攔截器實(shí)現(xiàn),本節(jié)將詳細(xì)講解如何自定義攔截器,需要的朋友可以參考下2023-07-07
java中double類型運(yùn)算結(jié)果異常的解決方法
下面小編就為大家?guī)硪黄猨ava中double類型運(yùn)算結(jié)果異常的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線程、定時(shí)器同步首頁數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線程、定時(shí)器同步首頁數(shù)據(jù),感興趣的小伙伴們可以參考一下2016-06-06
Java SimpleDateFormat中英文時(shí)間格式化轉(zhuǎn)換詳解
這篇文章主要為大家詳細(xì)介紹了Java SimpleDateFormat中英文時(shí)間格式化轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12

