Springboot接收?Form?表單數(shù)據(jù)的示例詳解
一、接收 Form 表單數(shù)據(jù)
1,基本的接收方法
(1)下面樣例Controller接收f(shuō)orm-data格式的POST數(shù)據(jù):
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@PostMapping("/postHello1")
public String postHello1(@RequestParam("name") String name,
@RequestParam("age") Integer age) {
return "name:" + name + "\nage:" + age;
}
}(2)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:

2,參數(shù)沒(méi)有傳遞的情況
(1)如果沒(méi)有傳遞參數(shù)Controller將會(huì)報(bào)錯(cuò),這個(gè)同樣有如下兩種解決辦法:
- 使用required = false標(biāo)注參數(shù)是非必須的。
- 使用defaultValue給參數(shù)指定個(gè)默認(rèn)值。
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@PostMapping("/postHello2")
public String postHello2(@RequestParam(name = "name", defaultValue = "xxx") String name,
@RequestParam(name = "age", required = false) Integer age) {
return "name:" + name + "\nage:" + age;
}
}
3,使用 map 來(lái)接收參數(shù)
(1)Controller還可以直接使用map來(lái)接收所有的請(qǐng)求參數(shù):
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@PostMapping("/postHello2")
public String postHello2(@RequestParam(name = "name", defaultValue = "xxx") String name,
@RequestParam(name = "age", required = false) Integer age) {
return "name:" + name + "\nage:" + age;
}
}(2)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:

4,接收一個(gè)數(shù)組
(1)表單中有多個(gè)同名參數(shù),Controller這邊可以定義一個(gè)數(shù)據(jù)進(jìn)行接收:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class HelloController {
@PostMapping("/postHello4")
public String postHello4(@RequestParam("name") String[] names) {
String result = "";
for(String name:names){
result += name + "\n";
}
return result;
}
}(2)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:

5,使用對(duì)象來(lái)接收參數(shù)
1)如果一個(gè)post請(qǐng)求的參數(shù)太多,我們構(gòu)造一個(gè)對(duì)象來(lái)簡(jiǎn)化參數(shù)的接收方式:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@PostMapping("/postHello5")
public String postHello5(User user) {
return "name:" + user.getName() + "\nage:" + user.getAge();
}
}(2)User類的定義如下,到時(shí)可以直接將多個(gè)參數(shù)通過(guò)getter、setter方法注入到對(duì)象中去:
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}(3)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:

(4)如果傳遞的參數(shù)有前綴,且前綴與接收實(shí)體類的名稱相同,那么參數(shù)也是可以正常傳遞的:

(5)如果一個(gè) post 請(qǐng)求的參數(shù)分屬不同的對(duì)象,也可以使用多個(gè)對(duì)象來(lái)接收參數(shù):
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@PostMapping("/postHello5-1")
public String hello(User user, Phone phone) {
return "name:" + user.getName() + "\nage:" + user.getAge()
+ "\nnumber:" + phone.getNumber();
}
}
6,使用對(duì)象接收時(shí)指定參數(shù)前綴
(1)如果傳遞的參數(shù)有前綴,且前綴與接收實(shí)體類的名稱不同相,那么參數(shù)無(wú)法正常傳遞:

(2)我們可以結(jié)合@InitBinder解決這個(gè)問(wèn)題,通過(guò)參數(shù)預(yù)處理來(lái)指定使用的前綴為 u.
除了在 Controller 里單獨(dú)定義預(yù)處理方法外,我們還可以通過(guò)@ControllerAdvice結(jié)合@InitBinder來(lái)定義全局的參數(shù)預(yù)處理方法,方便各個(gè)Controller使用。具體做法參考我之前的文章:
SpringBoot - @ControllerAdvice的使用詳解3(請(qǐng)求參數(shù)預(yù)處理 @InitBinder)
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
@RestController
public class HelloController {
@PostMapping("/postHello6")
public String postHello6(@ModelAttribute("u") User user) {
return "name:" + user.getName() + "\nage:" + user.getAge();
}
@InitBinder("u")
private void initBinder(WebDataBinder binder) {
binder.setFieldDefaultPrefix("u.");
}
}(3)重啟程序再次發(fā)送請(qǐng)求,可以看到參數(shù)已經(jīng)成功接收了:

二、接收字符串文本數(shù)據(jù)
(1)如果傳遞過(guò)來(lái)的是Text文本,我們可以通過(guò)HttpServletRequest獲取輸入流從而讀取文本內(nèi)容。
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@RestController
public class HelloController {
@PostMapping("/helloText")
public String hello(HttpServletRequest request) {
ServletInputStream is = null;
try {
is = request.getInputStream();
StringBuilder sb = new StringBuilder();
byte[] buf = new byte[1024];
int len = 0;
while ((len = is.read(buf)) != -1) {
sb.append(new String(buf, 0, len));
}
System.out.println(sb.toString());
return "獲取到的文本內(nèi)容為:" + sb.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
三、接收 JSON 數(shù)據(jù)
1,使用 Map 來(lái)接收數(shù)據(jù)
(1)如果把json作為參數(shù)傳遞,我們可以使用@requestbody接收參數(shù),將數(shù)據(jù)轉(zhuǎn)換Map:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@PostMapping("/helloBean")
public String hello(@RequestBody User user){
return user.getName() + " " + user.getAge();
}
}(2)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:

2,使用 Bean 對(duì)象來(lái)接收數(shù)據(jù)
(1)如果把json作為參數(shù)傳遞,我們可以使用@requestbody接收參數(shù),將數(shù)據(jù)直接轉(zhuǎn)換成對(duì)象:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@PostMapping("/helloBean")
public String hello(@RequestBody User user){
return user.getName() + " " + user.getAge();
}
}(2)下面是一個(gè)簡(jiǎn)單的測(cè)試樣例:

(4)如果傳遞的JOSN數(shù)據(jù)是一個(gè)數(shù)組也是可以的,Controller做如下修改:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class HelloController {
@PostMapping("/helloList")
public String helloList(@RequestBody List<User> users){
String result = "";
for(User user:users){
result += user.getName() + " " + user.getAge() + "\n";
}
return result;
}
}
到此這篇關(guān)于Springboot接收 Form 表單數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Springboot接收表單數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 用SpringBoot框架來(lái)接收multipart/form-data文件方式
- springboot2中使用@JsonFormat注解不生效的解決
- spring boot項(xiàng)目使用@JsonFormat失效問(wèn)題的解決
- springboot如何接收application/x-www-form-urlencoded類型的請(qǐng)求
- spring中@Transactional?注解失效的原因及解決辦法
- Spring的編程式事務(wù)TransactionTemplate的用法詳解
- Spring?Boot多數(shù)據(jù)源事務(wù)@DSTransactional的使用詳解
- Spring模塊詳解之Spring ORM和Spring Transaction詳解
相關(guān)文章
Java如何使用Agent和ASM在字節(jié)碼層面實(shí)現(xiàn)方法攔截
Agent是一種運(yùn)行在 Java 虛擬機(jī) (JVM) 上的特殊程序,ASM是一個(gè)輕量級(jí)的 Java 字節(jié)碼編輯和分析框架,本文為大家介紹了如何利用他們?cè)谧止?jié)碼層面實(shí)現(xiàn)方法攔截,感興趣的可以了解一下2023-05-05
Spring MVC請(qǐng)求參數(shù)與響應(yīng)結(jié)果全局加密和解密詳解
這篇文章主要給大家介紹了關(guān)于Spring MVC請(qǐng)求參數(shù)與響應(yīng)結(jié)果全局加密和解密的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
java存儲(chǔ)以及java對(duì)象創(chuàng)建的流程(詳解)
下面小編就為大家?guī)?lái)一篇java存儲(chǔ)以及java對(duì)象創(chuàng)建的流程(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
詳解mybatis-plus配置找不到Mapper接口路徑的坑
這篇文章主要介紹了詳解mybatis-plus配置找不到Mapper接口路徑的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
淺談java 面對(duì)對(duì)象(抽象 繼承 接口 多態(tài))
下面小編就為大家?guī)?lái)一篇淺談java 面對(duì)對(duì)象(抽象 繼承 接口 多態(tài))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02

