SpringBoot - 獲取Get請求參數詳解(附樣例:非空、默認值、數組、對象)


利用 Spring Boot 來制作 Web 應用,就必定會涉及到前端與后台之間互相傳遞參數。下面演示 Controller 如何接收以 GET 方式傳遞過來的參數。

一、參數直接在路徑中

(1)假設請求地址是如下這種 RESTful 風格,hangge 這個參數值直接放在路徑里面:

http://localhost:8080/helloworld/張三

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @GetMapping("/helloworld/{name}")
    public String helloworld(@PathVariable("name") String name) {
        return "獲取到的name是:" + name;
    }


}

 

二、參數跟在 ? 號后面

1,獲取參數的基本方法

(1)假設請求地址是如下這種傳統方式,參數跟在問號后面:
http: //localhost:8080/helloworld1?name=張三
(2)Controller 可以這么獲取該參數:
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
 
@RestController
public class HelloController {
    @GetMapping("/helloworld1")
    public String helloworld1(@RequestParam("name") String name) {
        return "獲取到的name是:" + name;
    }
}

 

 

2,參數沒有傳遞的情況

(1)如果沒有傳遞參數 Controller 將會報錯,我們可以使用 required = false 標注參數是非必須的。
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
 
@RestController
public class HelloController {
    @GetMapping("/helloworld2")
    public String helloworld2(@RequestParam(name = "name", required = false) String name) {
        return "獲取到的name是:" + name;
    }
}

 

(2)或者可以指定個默認值,當沒有傳遞參數時自動使用默認值:
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
 
@RestController
public class HelloController {
    @GetMapping("/helloworld3")
    public String helloworld3(@RequestParam(name = "name", defaultValue = "xxx") String name) {
        return "獲取到的name是:" + name;
    }
}

 

3,使用 map 來接收參數

(1)Controller 還可以直接使用 map 來接收所有的請求參數:
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
 
import java.util.Map;
 
@RestController
public class HelloController {
    @GetMapping("/helloworld4")
    public String helloworld4(@RequestParam Map<String, Object> params) {
        return "name:" + params.get("name") + "<br>age:" + params.get("age");
    }
}

(2)下面是一個簡單的測試樣例:

 

4,接收一個數組

(1)假設請求地址是如下這種,有多個同名參數:
http://localhost:8080/helloworld5?name=zhangsan&name=lisi

(2)我們可以定義一個數組類型的參數來接收:

import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
 
@RestController
public class HelloController {
    @GetMapping("/helloworld5")
    public String helloworld5(@RequestParam("name") String[] names) {
        String result = "";
        for(String name:names){
            result += name + "<br>";
        }
        return result;
    }
}

 

附:使用對象來接收參數

1,基本用法

(1)如果一個 get 請求的參數太多,我們構造一個對象來簡化參數的接收方式:
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
 
@RestController
public class HelloController {
    @GetMapping("/helloworld6")
    public String helloworld6(User user) {
        return "name:" + user.getName() + "<br> age:" + user.getAge();
    }
}

(2)User 類的定義如下,到時可以直接將多個參數通過 getter、setter 方法注入到對象中去:

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)下面是一個簡單的測試樣例:

 

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

2,指定參數前綴

(1)如果傳遞的參數有前綴,且前綴與接收實體類的名稱不同相,那么參數無法正常傳遞:

 

(2)我們可以結合 @InitBinder 解決這個問題,通過參數預處理來指定使用的前綴為 u.
 除了在 Controller 里單獨定義預處理方法外,我們還可以通過 @ControllerAdvice 結合 @InitBinder 來定義全局的參數預處理方法,方便各個 Controller 使用。具體做法參考我之前的文章:
  • SpringBoot - @ControllerAdvice的使用詳解3(請求參數預處理 @InitBinder)
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
 
@RestController
public class HelloController {
    @GetMapping("/helloworld7")
    public String helloworld7(@ModelAttribute("u") User user) {
        return "name:" + user.getName() + "<br> age:" + user.getAge();
    }
 
    @InitBinder("u")
    private void initBinder(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("u.");
    }
}

(3)重啟程序可以看到參數以及成功接收了:

 

3,構造多個對象來接收參數

(1)如果一個 get 請求的參數分屬不同的對象,也可以使用多個對象來接收參數:
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
 
@RestController
public class HelloController {
    @GetMapping("/helloworld8")
    public String helloworld8(User user, Phone phone) {
        return "name:" + user.getName() + "<br> age:" + user.getAge()
                + "<br> number:" + phone.getNumber();
    }
}

(2)新增的 Phone 類定義如下:

public class Phone {
    private String number;
 
    public String getNumber() {
        return number;
    }
 
    public void setNumber(String number) {
        this.number = number;
    }
}

(3)下面是一個簡單的測試樣例:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM