欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringMVC中的請求參數(shù)接收方式

 更新時間:2025年04月07日 09:18:10   作者:web_15534274656  
這篇文章主要介紹了SpringMVC中的請求參數(shù)接收方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

SpringMVC請求參數(shù)接收

在瀏覽器與程序進(jìn)行交互時,主要分為三個階段

1. 建立連接:**將用戶(瀏覽器)和 Java 程序連接起來,也就是訪問一個地址能夠調(diào)用到Spring程序

2. 請求:用戶請求時會攜帶一些參數(shù),在程序中要想辦法獲取到參數(shù),因此請求這部分主要是獲取參數(shù)的功能

3. 響應(yīng):**在執(zhí)行了業(yè)務(wù)邏輯之后,要將程序執(zhí)行的結(jié)果返回給客戶,也就是響應(yīng)

在本篇文章中,我們來學(xué)習(xí)請求(獲取參數(shù))這部分內(nèi)容

請求

訪問不同的路徑,就是發(fā)送不同的請求,在發(fā)送請求時,可能會帶一些參數(shù),因此學(xué)習(xí) Spring 的請求,主要就是學(xué)習(xí) 如何傳遞參數(shù)到后端 以及 后端如何接收參數(shù)

在本篇文章中,為了更方便學(xué)習(xí),則不采用前端傳遞參數(shù),而是使用 瀏覽器postman 來模擬

傳遞單個參數(shù)

接收單個參數(shù)時,直接用方法中的參數(shù)即可:

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping(value = "/login")
    public String login(String name) {
        return "接收到用戶名: " + name;
    }
}

使用 瀏覽器發(fā)送請求:127.0.0.1:8080/user/login?name=zhangsan

后端程序正確拿到 name 參數(shù)的值

Spring MVC 會根據(jù)方法的參數(shù)名,找到對應(yīng)的參數(shù),賦值給方法

當(dāng)參數(shù)名稱不一致時,獲取不到參數(shù):

當(dāng)未傳遞參數(shù)時:

基本類型參數(shù)傳遞

我們測試使用基本類型來接收參數(shù)時:

@RequestMapping("/test")
@RestController
public class TestController {
    @RequestMapping("/getInt")
    public String getInt(int age) {
        return "接收到參數(shù)age: " + age;
    }
}

未傳遞參數(shù)

報(bào)了 500 錯誤

500 錯誤碼是指**“Internal Server Error**”(服務(wù)器內(nèi)部錯誤),是表示服務(wù)器在處理請求時遇到了未知的錯誤或異常情況。這種錯誤通常是由服務(wù)器端代碼出現(xiàn)問題引起的,而不是客戶端請求的問題。

我們查看日志信息:

int 類型的參數(shù) age 雖然是可選的,但是由于被聲明為基本類型而不能轉(zhuǎn)換為空值??紤]將其聲明為對應(yīng)基本類型的包裝類型

我們使用包裝類型 Integer 來接收參數(shù):

    @RequestMapping("/getInteger")
    public String getInt(Integer age) {
        return "接收到參數(shù)age: " + age;
    }

當(dāng)未傳遞對應(yīng)參數(shù)時,接收到的數(shù)據(jù)為 null

在使用基本類型來接收參數(shù)時,參數(shù)必須傳(除了 boolean 類型)

當(dāng)使用 boolean 類型接收時:

    @RequestMapping("/getBoolean")
    public String getBoolean(boolean b) {
        return "接收到參數(shù)b: " + b;
    }

未傳遞參數(shù)時,默認(rèn)值為 false:

因此,對于參數(shù)可能為空的數(shù)據(jù),建議使用包裝類型接收

傳遞參數(shù)類型不匹配

此時報(bào)了 400 錯誤

400 錯誤碼是指"Bad Request"(錯誤請求),表示服務(wù)器無法理解客戶端發(fā)送的請求,因?yàn)檎埱笳Z法有誤、請求參數(shù)無效或者請求消息體格式錯誤等。

我們觀察后端日志:

類型轉(zhuǎn)換失敗

傳遞多個參數(shù)

與接收單個參數(shù)一樣,直接使用方法的參數(shù)接收即可:

    @RequestMapping(value = "/login")
    public String login(String name, String password) {
        return "接收到用戶名: " + name + " 接收到密碼: " + password;
    }

后端程序正確拿到了 name 和 password 參數(shù)的值

當(dāng)有多個參數(shù)時,前后端進(jìn)行參數(shù)匹配時,是以參數(shù)的名稱進(jìn)行匹配的,因此參數(shù)的位置不影響后端數(shù)據(jù)獲取參數(shù)的結(jié)果

傳遞對象

當(dāng)參數(shù)比較多時,就需要很多形參,并且每增加一個參數(shù),就需要修改方法的聲明,此時,我們可以將這些參數(shù)封裝為一個對象

public class Student {
    private int id;
    private String name;
    private int age;
    private String sex;

    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;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", age=" + age +
                ", sex='" + sex + ''' +
                '}';
    }
}

傳遞對象:

    @RequestMapping("/getStudent")
    public String getStudent(Student student) {
        return "接收到參數(shù)student: " + student;
    }

后端程序正確接收到各個屬性的值

Spring 會根據(jù)參數(shù)名稱自動綁定到對象的各個屬性

當(dāng)某個屬性未傳遞時,則賦值為null,基本類型則賦值為默認(rèn)初始值

后端參數(shù)重命名

前端傳遞的參數(shù) key 和 后端接收到的 key 可以不一致,例如前端傳遞參數(shù) name 給后端,而后端使用 userName 來接收,這種請求下,我們可以使用注解 @RequestParam 來重命名前后端的參數(shù)值

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/login")
    public String login(@RequestParam("name") String userName) {
        return "接收到用戶名: " + userName;
    }
}

傳遞的參數(shù) name 正確綁定到后端參數(shù) userName 上

而此時,若使用 userName 進(jìn)行傳參:

觀察打印的錯誤日志:

請求參數(shù) name 不存在

我們可以發(fā)現(xiàn):

1. 在使用 @RequestParam 進(jìn)行重命名時,請求參數(shù)只能與 @RequestParam 聲明的名稱一致,才能進(jìn)行參數(shù)綁定和賦值

2. 在使用 @RequestParam 進(jìn)行重命名時,參數(shù)就變成了必傳參數(shù)

在使用 @RequestParam 時,若前端參數(shù)是一個非必傳參數(shù),此時該如何解決呢?

我們查看 @RequestParam 注解的實(shí)現(xiàn)細(xì)節(jié):

我們可以看到, required 的默認(rèn)值為 true,表示:該注解修飾的參數(shù)默認(rèn)為必傳

因此,我們可以設(shè)置 @RequestParam 中的 required = false,來避免不傳遞參數(shù)時報(bào)錯:

    @RequestMapping("/login")
    public String login(@RequestParam(value = "name", required = false) String userName) {
        return "接收到用戶名: " + userName;
    }

在添加 required = false后,name 前面也加上了 key,value = “name”

  • 注解屬性賦值時,若未指明 key,則默認(rèn)為 value 屬性
  • 若需要有多個屬性進(jìn)行賦值,則需要寫上 key

傳遞數(shù)組

Spring MVC 可以自動綁定數(shù)組參數(shù)的賦值

@RequestMapping("/test")
@RestController
public class TestController {
    @RequestMapping("getArray")
    public String getArray(String[] array) {
        return Arrays.toString(array);
    }
}

發(fā)送請求并傳參:

中間分割的 , 必須為英文的逗號

也可使用:

請求參數(shù)名與形參數(shù)組名稱相同且請求參數(shù)多個,后端定義數(shù)組類型形參即可接收參數(shù)

傳遞集合

集合參數(shù)與數(shù)組類似,同一個請求參數(shù)名有多個,且需要使用 @RequestParam 綁定參數(shù)關(guān)系

默認(rèn)情況下,請求中參數(shù)名相同的多個值,是封裝到數(shù)組中的,若需要封裝到集合中,需要使用 @RequestParam 綁定參數(shù)關(guān)系

    @RequestMapping("/getList")
    public String getList(@RequestParam List<String> list) {
        return "接收到參數(shù)list" + list;
    }

同樣的,有兩種方式進(jìn)行傳參:

傳遞JSON數(shù)據(jù)

JSON是什么

JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,易于人類閱讀和編寫,也易于機(jī)器解析和生成。其就是一種數(shù)據(jù)格式,有自己的格式和語法,使用文本表示一個對象或數(shù)組的信息,因此 JSON本質(zhì)是字符串,主要負(fù)責(zé)在不同的語言中數(shù)據(jù)傳遞和交互

我們來看一段JSON數(shù)據(jù):

{
  "name": "zhangsan",
  "age": 18,
  "isStudent": true,
  "courses": ["Math", "English", "History"]
}

也可以壓縮表示:

{"name":"zhangsan","age":18,"isStudent":true,"courses":["Math","English","History"]}

與上面描述的數(shù)據(jù)是一樣的,只是上面的進(jìn)行了格式化,更易讀

JSON的語法:

  • 數(shù)據(jù)在 鍵值對(key/value)中
  • 數(shù)據(jù)由逗號, 分割
  • 對象用{}表示
  • 數(shù)組用[]表示
  • 值可以為對象,也可以為數(shù)組,數(shù)組中可以包含多個對象

JSON中的兩種結(jié)構(gòu)

  • 對象:{} 保存的對象是一個 無序的鍵值對集合,一個對象以 { 開始,} 結(jié)束,每個鍵(key)后面跟一個 : ,鍵值對使用 , 分割
  • 數(shù)組:[]保存的數(shù)組是值(value)的有序集合,一個數(shù)組以 [ 開始,] 結(jié)束,值之間使用 , 分割

在使用JSON時,我們可以使用在線JSON格式化工具進(jìn)行校驗(yàn)和書寫

JSON 字符串和Java對象互轉(zhuǎn)

JSON 本質(zhì)上是一個字符串,通過文本來存儲和描述數(shù)據(jù)

Spring MVC 框架也集成了 JSON 的轉(zhuǎn)換工具,我們可以直接使用,來完成 JSON 字符串和 Java對象的互轉(zhuǎn)

本質(zhì)是是 jackson-databind 提供的功能,Spring MVC 框架中已經(jīng)將該工具包引進(jìn)了,直接使用即可,若脫離 Spring MVC 使用,需要引入相關(guān)依賴

<dependency>
 <groupId>com.fasterxml.jackson.core</groupId>
 <artifactId>jackson-databind</artifactId>
 <version>2.13.5</version>
</dependency>

JSON的轉(zhuǎn)換工具包有很多,也可以使用其他的

@SpringBootTest
class JSONUtilsTest {
    @Autowired
    private ObjectMapper objectMapper;
    @Test
    public void jsonTest() throws JsonProcessingException {
        Student student = new Student();
        student.setId(1);
        student.setName("zhangsan");
        student.setAge(13);
        student.setSex("男");
        // 將對象轉(zhuǎn)換為 JSON 字符串
        String jsonStr = objectMapper.writeValueAsString(student);
        System.out.println("JSON字符串為:" + jsonStr);
        // 將JSON字符串轉(zhuǎn)換為對象
        Student student1 = objectMapper.readValue(jsonStr, Student.class);
        System.out.println("轉(zhuǎn)換的對象:" + student1);
    }
}

使用 ObjectMapper 對象提供的兩個方法,可以完成 對象 和 JSON 字符串的互換

  • **writeValueAsString:**將對象轉(zhuǎn)換為JSON字符串
  • **readValue:**將字符串轉(zhuǎn)換為對象

運(yùn)行結(jié)果:

JSON的優(yōu)點(diǎn)

  • 1. 易于理解和閱讀: JSON采用了人類可讀的文本格式,基本上可以直接閱讀和理解,這使得開發(fā)人員和數(shù)據(jù)工程師可以輕松地查看數(shù)據(jù)內(nèi)容。
  • 2. 輕量和高效: JSON數(shù)據(jù)以文本形式存儲,相比于其他二進(jìn)制格式如XML,它的數(shù)據(jù)量通常更小,傳輸和解析速度更快,特別是在網(wǎng)絡(luò)傳輸和移動設(shè)備上更為高效。
  • 3. 跨平臺和語言無關(guān): JSON在多種編程語言中都有支持和解析庫,因此可以在不同的平臺和系統(tǒng)中使用和傳輸數(shù)據(jù),無需擔(dān)心兼容性問題。
  • 4. 易于解析和生成: JSON數(shù)據(jù)格式簡單明了,解析起來也比較容易。幾乎所有現(xiàn)代編程語言都有JSON解析器和生成器,可以方便地將JSON數(shù)據(jù)轉(zhuǎn)換成各種數(shù)據(jù)結(jié)構(gòu)或者將數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成JSON格式
  • **5. 安全性較高:**JSON數(shù)據(jù)格式是一種純文本格式,不包含可執(zhí)行代碼,不會執(zhí)行惡意代碼,因此具有較高的安全性

因此,JSON在web應(yīng)用程序中被廣泛使用(前后端數(shù)據(jù)交互、API接口數(shù)據(jù)傳輸?shù)鹊龋?/p>

傳遞JSON對象

  • 接收J(rèn)SON對象,需要使用 @RequestBody 注解
  • @RequestBody:RequestBody,即請求正文,表示這個注解作用在請求正文的數(shù)據(jù)綁定,請求參數(shù)必須寫在請求正文中,@RequestBody 注解的作用是將HTTP請求體中的數(shù)據(jù)轉(zhuǎn)換為Java對象,并作為方法的參數(shù)傳入
    @RequestMapping("/getStudent")
    public String getStudent(@RequestBody Student student) {
        return "接收到參數(shù)student: " + student;
    }

使用postman發(fā)送JSON請求參數(shù):

后端成功接收

獲取URL中的參數(shù)

在獲取URL中的參數(shù)時,我們需要使用 @PathVariable 注解

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/login/{id}/{name}")
    public String login(@PathVariable Integer id, @PathVariable String name) {
        return "接收到id: " + id + " 接收到name: " + name;
    }
}

使用postman測試:

后端正確獲取到URL中的參數(shù)

  • 當(dāng)方法的參數(shù)名稱和需要綁定的URL中的變量名稱一致時,可以不用給 @PathVariable 的屬性賦值
  • 而當(dāng)方法的參數(shù)名稱和需要綁定的URL中的變量名稱不一致時,需要對 @PathVariable的屬性value賦值
    @RequestMapping("/login/{id}/{name}")
    public String login(@PathVariable Integer id, @PathVariable("name") String userName) {
        return "接收到id: " + id + " 接收到name: " + userName;
    }

文件上傳

在傳輸文件時,我們需要使用 @RequestPart

@RequestMapping("/test")
@RestController
public class TestController {
    @RequestMapping("getFile")
    public String getFile(@RequestPart("file")MultipartFile multipartFile) throws IOException {
        // 獲取文件名
        String fileName = multipartFile.getOriginalFilename();
        // 將文件上傳到指定路徑
        multipartFile.transferTo(new File("D:/" + multipartFile.getOriginalFilename()));
        return "接收到文件:" + fileName;
    }
}

使用postman發(fā)送請求:

同時查看文件是否上傳成功:

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot集成Seata實(shí)現(xiàn)基于AT模式的分布式事務(wù)的解決方案

    Spring Boot集成Seata實(shí)現(xiàn)基于AT模式的分布式事務(wù)的解決方案

    Seata 是一款開源的分布式事務(wù)解決方案,致力于提供高性能和簡單易用的分布式事務(wù)服務(wù),這篇文章主要介紹了Spring Boot集成Seata實(shí)現(xiàn)基于AT模式的分布式事務(wù),需要的朋友可以參考下
    2024-08-08
  • SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解

    SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解

    這篇文章主要介紹了SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Spring Bean生命周期之Bean的實(shí)例化詳解

    Spring Bean生命周期之Bean的實(shí)例化詳解

    這篇文章主要為大家詳細(xì)介紹了Spring Bean生命周期之Bean的實(shí)例化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 解決SpringBoot使用@Value獲取不到y(tǒng)aml中配置值的問題

    解決SpringBoot使用@Value獲取不到y(tǒng)aml中配置值的問題

    在最近的開發(fā)中遇到一個問題,使用@Value獲取yml文件中配置的屬性時始終獲取不到值,所以本文給大家詳細(xì)介紹了SpringBoot使用@Value獲取不到y(tǒng)aml中值的問題分析及解決方法,需要的朋友可以參考下
    2024-01-01
  • Maven和IntelliJ IDEA搭建多模塊微服務(wù)的實(shí)現(xiàn)

    Maven和IntelliJ IDEA搭建多模塊微服務(wù)的實(shí)現(xiàn)

    本文主要介紹了Maven和IntelliJ IDEA搭建多模塊微服務(wù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 詳解Java中==和equals()的區(qū)別

    詳解Java中==和equals()的區(qū)別

    這篇文章主要介紹了Java中==和equals()的區(qū)別,,==可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中,equals()是方法,只能用于引用數(shù)據(jù)類型,需要的朋友可以參考下
    2021-11-11
  • Java的字節(jié)緩沖流與字符緩沖流解析

    Java的字節(jié)緩沖流與字符緩沖流解析

    這篇文章主要介紹了Java的字節(jié)緩沖流與字符緩沖流解析,Java 緩沖流是Java I/O庫中的一種流,用于提高讀寫數(shù)據(jù)的效率,它通過在內(nèi)存中創(chuàng)建緩沖區(qū)來減少與底層設(shè)備的直接交互次數(shù),從而減少了I/O操作的開銷,需要的朋友可以參考下
    2023-11-11
  • MyBatis實(shí)踐之DAO與Mapper

    MyBatis實(shí)踐之DAO與Mapper

    MyBatis前身是iBatis,是一個基于Java的數(shù)據(jù)持久層/對象關(guān)系映射(ORM)框架.通過本文給大家介紹MyBatis實(shí)踐之DAO與Mapper的相關(guān)知識,需要的朋友參考下吧
    2016-03-03
  • Java處理XSS漏洞的四種方法小結(jié)

    Java處理XSS漏洞的四種方法小結(jié)

    本文主要介紹了Java處理XSS漏洞的四種方法小結(jié),包含使用HTML實(shí)體編碼、使用內(nèi)容安全策略(CSP)、使用框架內(nèi)置的XSS防護(hù)和自定義過濾器等方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • 淺談java二進(jìn)制、十進(jìn)制、十六進(jìn)制、字符串之間的相互轉(zhuǎn)換

    淺談java二進(jìn)制、十進(jìn)制、十六進(jìn)制、字符串之間的相互轉(zhuǎn)換

    下面小編就為大家?guī)硪黄獪\談二進(jìn)制、十進(jìn)制、十六進(jìn)制、字符串之間的相互轉(zhuǎn)換。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-06-06

最新評論