Spring?MVC??接受請求參數的方法
一、HTTP 請求 如何攜帶參數
在HTTP請求中攜帶參數的方式取決于你使用的請求方法。常見的HTTP方法有GET和POST,參數傳遞的方式也有所不同:
1. GET 方法
GET方法通常用于請求服務器發(fā)送資源,參數直接附加在URL之后,通過?
分隔URL和參數,多個參數之間用&
連接。例如:
GET /search?query=網絡安全&sort=latest HTTP/1.1 Host: www.example.com
這里,URL是/search
,參數有兩個:
query=網絡安全
sort=latest
2. POST 方法
POST方法通常用于提交數據到服務器。與GET方法不同,POST方法通常將參數包含在請求體中,不顯示在URL中(但是普通的參數也可以出現(xiàn)在URL中)。只有form 表單在post 請求中固定在 body、get 出現(xiàn)在url 中。這樣可以發(fā)送更大的數據量,也更安全。參數可以以不同的格式發(fā)送,常見的有:
表單數據(application/x-www-form-urlencoded
)
數據以鍵值對形式發(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數據(application/json
)
數據以JSON格式發(fā)送,適用于復雜結構的數據交換。例如:
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等,這些方法也可以攜帶參數,通常是在請求體中,格式可以是表單數據、JSON或其他MIME類型。
小技巧
- 使用GET方法時,由于URL長度存在限制,不適合傳輸大量信息。
- 使用POST方法時,可通過適當的
Content-Type
頭部來控制數據的編碼方式。
二、Spring MVC 接受參數
在 Spring MVC 中,處理來自客戶端的參數有幾種常用的方式。Spring MVC 提供了靈活的方式來接收來自 HTTP 請求的參數,并將其綁定到控制器方法的參數中。這些方法包括使用注解如 @RequestParam
, @PathVariable
, @RequestBody
, 和 @ModelAttribute
等。下面是這些注解的基本使用方法:
1. 使用 @RequestParam
這個注解用于處理來自查詢字符串或表單數據的參數。例如,對于一個 GET 請求,你可以這樣使用:
@GetMapping("/search") public String search(@RequestParam("query") String query) { // 使用 query 參數 return "Result for: " + query; }
如果你的參數名和方法的參數名相同,你還可以省略 @RequestParam
中的值:
@GetMapping("/search") public String search(@RequestParam String query) { return "Result for: " + query; }
如果參數?較多時, ?法聲明就需要有很多形參. 并且后續(xù)每次新增?個參數, 也需要修改?法聲明. 我們不妨把這些參數封裝為?個對象.
@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 風格的 URL 中的參數,如:
@GetMapping("/users/{userId}") public String getUser(@PathVariable("userId") Long userId) { // 使用 userId 參數 return "User profile for ID: " + userId; }
如果變量名和參數名相同,也可以省略:
@GetMapping("/users/{userId}") public String getUser(@PathVariable Long userId) { return "User profile for ID: " + userId; }
3. 使用 @RequestBody
這個注解用于處理 JSON 或 XML 等請求體數據。通常與 POST 或 PUT 請求一起使用:
@PostMapping("/users") public String addUser(@RequestBody User user) { // 處理 user 對象 return "Added user with ID: " + user.getId(); }
4. 使用 @ModelAttribute
用于綁定請求參數到一個模型對象,通常用于處理表單提交:
@PostMapping("/users/update") public String updateUser(@ModelAttribute User user) { // 更新 user 對象 return "Updated user with ID: " + user.getId(); }
5.傳遞數組和集合
Spring MVC 可以?動綁定數組參數的賦值
@RequestMapping("/m5") public String method5(String[] arrayParam) { return Arrays.toString(arrayParam); }
集合參數:和數組類似, 同?個請求參數名有為多個, 且需要使? @RequestParam 綁定參數關系 默認情況下,請求中參數名相同的多個值,是封裝到數組. 如果要封裝到集合,要使? @RequestParam 綁定參數關系
6.接受String 轉成 Json
Jackson 是在 Spring 框架中常用的 JSON 處理庫。要使用 Jackson 進行 JSON 與字符串的互轉,首先需要在你的項目中添加 Jackson 的依賴。如果你使用 Maven,可以添加如下依賴到你的 pom.xml
文件:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency>
在 Spring MVC 中,直接使用字符串來接收參數后再手動處理確實是一種可行的方法,尤其是在某些情況下,你可能想對接收到的數據進行特殊處理,或者原始數據格式與你的業(yè)務邏輯需求不完全匹配時。這種方式提供了更大的靈活性,允許你在將數據轉換成 Java 對象之前,先進行驗證、清洗或者格式化。
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);
例如,如果你希望接收一個 JSON 格式的請求體,但暫時不想將其自動綁定到一個 Java 對象,你可以將請求體作為一個普通的字符串接收:
@PostMapping("/api/data") public ResponseEntity<String> processData(@RequestBody String rawData) { try { // 手動解析 JSON 字符串 ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(rawData); // 假設我們需要處理 name 字段 String name = rootNode.path("name").asText(); // 進行業(yè)務邏輯處理 return ResponseEntity.ok("Received name: " + name); } catch (JsonProcessingException e) { return ResponseEntity.badRequest().body("Invalid JSON"); } }
三、常見問題
在 Spring MVC 中,當你使用基本數據類型(如 int
, double
, boolean
等)作為方法參數時,確實可能遇到一些問題,尤其是涉及到參數可能不存在或可選的情況。這是因為基本數據類型不能接受 null
值,而包裝類(如 Integer
, Double
, Boolean
等)可以接受 null
值。
假設你有一個使用基本數據類型參數的方法:
@GetMapping("/calculate") public String calculate(@RequestParam("number") int number) { // 使用 number 參數 return "Result: " + number * 2; }
如果 HTTP 請求沒有提供 number
參數,Spring MVC 將嘗試將 null
轉換為基本類型 int
,這將失敗并引發(fā)一個異常,因為基本類型不能接受 null
值。
解決方案
1.使用包裝類
更改參數為相應的包裝類可以解決這個問題,因為包裝類可以接受 null
值:
@GetMapping("/calculate") public String calculate(@RequestParam("number") Integer number) { if (number == null) { return "Number parameter is missing"; } return "Result: " + number * 2; }
2.設置默認值
另一個常用的解決方案是為 @RequestParam
設置一個默認值,這樣如果請求中沒有提供該參數,將使用默認值:
@GetMapping("/calculate") public String calculate(@RequestParam(value = "number", defaultValue = "0") int number) { // 無需檢查 null,因為已經有默認值 return "Result: " + number * 2; }
在這個例子中,如果沒有提供 number
參數,number
將默認為 0
。
3.設置 required 為 false
你也可以將 @RequestParam
的 required
屬性設置為 false
,并使用包裝類來明確表明這個參數是可選的:
@GetMapping("/calculate") public String calculate(@RequestParam(value = "number", required = false) Integer number) { if (number == null) { return "Number parameter is optional"; } return "Result: " + number * 2; }
到此這篇關于Spring MVC 接受請求參數的文章就介紹到這了,更多相關Spring MVC 請求參數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring中的@ControllerAdvice和@ExceptionHandler注解處理全局異常
這篇文章主要介紹了Spring中的@ControllerAdvice和@ExceptionHandler注解處理全局異常,@ControllerAdvice ,@ControllerAdvice是一個非常有用的注解,顧名思義,這是一個增強的 Controller,一般配合@ExceptionHandler使用來處理全局異常,需要的朋友可以參考下2024-01-01Java實現(xiàn)BP神經網絡MNIST手寫數字識別的示例詳解
這篇文章主要為大家詳細介紹了Java實現(xiàn)BP神經網絡MNIST手寫數字識別的相關方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01淺談js文件引用方式及其同步執(zhí)行與異步執(zhí)行
下面小編就為大家?guī)硪黄獪\談js文件引用方式及其同步執(zhí)行與異步執(zhí)行。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10Springboot打包為Docker鏡像并部署的實現(xiàn)
這篇文章主要介紹了Springboot打包為Docker鏡像并部署的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12java Quartz定時器任務與Spring task定時的幾種實現(xiàn)方法
本篇文章主要介紹了java Quartz定時器任務與Spring task定時的幾種實現(xiàn)方法的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02