首頁(yè)技術(shù)文章正文

如何發(fā)送和接收參數(shù)?五種參數(shù)傳遞方法

更新時(shí)間:2022-11-30 來(lái)源:黑馬程序員 瀏覽量:

通常情況下,我們可以使用GET或POST來(lái)發(fā)送請(qǐng)求和數(shù)據(jù),但GET和POST兩種方法所攜帶的數(shù)據(jù)都是比較簡(jiǎn)單的數(shù)據(jù),接下來(lái)在我們這個(gè)基礎(chǔ)上,列舉5種比較負(fù)責(zé)的參數(shù)傳遞方法,并對(duì)這些參數(shù)如何發(fā)送,后臺(tái)改如何接收做詳細(xì)的講解。

常見(jiàn)的參數(shù)種類有:

 ·普通參數(shù)

 ·POJO類型參數(shù)

 ·嵌套POJO類型參數(shù)

 ·數(shù)組類型參數(shù)

 ·集合類型參數(shù)

普通參數(shù)

普通參數(shù):url地址傳參,地址參數(shù)名與形參變量名相同,定義形參即可接收參數(shù)。
普通參數(shù)

如果形參與地址參數(shù)名不一致該如何解決呢?

發(fā)送請(qǐng)求與參數(shù),示例代碼如下:

http://localhost/commonParamDifferentName?name=張三&age=18

后臺(tái)接收參數(shù):

@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(String userName, int age) {
    System.out.println("普通參數(shù)傳遞 userName ==> " + userName);
    System.out.println("普通參數(shù)傳遞 age ==> " + age);
    return "{'module':'common param different name'}";
}

因?yàn)榍岸私o的是name ,后臺(tái)接收使用的是userName ,兩個(gè)名稱對(duì)不上,導(dǎo)致接收數(shù)據(jù)失敗:

1669798471507_12.png

使用@RequestParam注解,可以避免接受數(shù)據(jù)失敗。

@RequestMapping("/commonParamDifferentName")
    @ResponseBody
    public String commonParamDifferentName(@RequestPaam("name") String 
userName, int age) {
    System.out.println("普通參數(shù)傳遞 userName ==> " + userName);
    System.out.println("普通參數(shù)傳遞 age ==> " + age);
    return "{'module':'common param different name'}";
}

注意:寫(xiě)上@RequestParam注解框架就不需要自己去解析注入,能提升框架處理性能。

POJO數(shù)據(jù)類型

簡(jiǎn)單數(shù)據(jù)類型一般處理的是參數(shù)個(gè)數(shù)比較少的請(qǐng)求,如果參數(shù)比較多,那么后臺(tái)接收參數(shù)的時(shí)候就比較復(fù)雜,這個(gè)時(shí)候我們可以考慮使用POJO數(shù)據(jù)類型。

POJO參數(shù):請(qǐng)求參數(shù)名與形參對(duì)象屬性名相同,定義POJO類型形參即可接收參數(shù)此時(shí)需要使用前面準(zhǔn)備好的POJO類,先來(lái)看下User

public class User {
    private String name;
    private int age;
    //setter...getter...略
}

發(fā)送請(qǐng)求和參數(shù):

1669798826184_13.png

后臺(tái)接收參數(shù):

//POJO參數(shù):請(qǐng)求參數(shù)與形參對(duì)象中的屬性對(duì)應(yīng)即可完成參數(shù)傳遞
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
    System.out.println("pojo參數(shù)傳遞 user ==> "+user);
    return "{'module':'pojo param'}";
}

注意:

POJO參數(shù)接收,前端GET和POST發(fā)送請(qǐng)求數(shù)據(jù)的方式不變。 請(qǐng)求參數(shù)key的名稱要和POJO中屬性的名稱一致,否則無(wú)法封裝。

嵌套POJO類型參數(shù)

如果POJO對(duì)象中嵌套了其他的POJO類,如:

public class Address {
    private String province;
    private String city;
    //setter...getter...略
}
public class User {
    private String name;
    private int age;
    private Address address;
    //setter...getter...略
}

嵌套POJO參數(shù):請(qǐng)求參數(shù)名與形參對(duì)象屬性名相同,按照對(duì)象層次結(jié)構(gòu)關(guān)系即可接收嵌套POJO屬性參數(shù)發(fā)送請(qǐng)求和參數(shù):

1669799111082_14.png

后臺(tái)接收參數(shù):

//POJO參數(shù):請(qǐng)求參數(shù)與形參對(duì)象中的屬性對(duì)應(yīng)即可完成參數(shù)傳遞
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
    System.out.println("pojo參數(shù)傳遞 user ==> "+user);
    return "{'module':'pojo param'}";
}

注意:

請(qǐng)求參數(shù)key的名稱要和POJO中屬性的名稱一致,否則無(wú)法封裝。

數(shù)組類型參數(shù)

舉個(gè)簡(jiǎn)單的例子,如果前端需要獲取用戶的愛(ài)好,愛(ài)好絕大多數(shù)情況下都是多個(gè),如何發(fā)送請(qǐng)求數(shù)據(jù)和接收數(shù)據(jù)呢?

數(shù)組參數(shù):請(qǐng)求參數(shù)名與形參對(duì)象屬性名相同且請(qǐng)求參數(shù)為多個(gè),定義數(shù)組類型即可接收參數(shù),發(fā)送請(qǐng)求和參數(shù)的示例代碼如下:

1669799243597_15.png

后臺(tái)接收參數(shù):

//數(shù)組參數(shù):同名請(qǐng)求參數(shù)可以直接映射到對(duì)應(yīng)名稱的形參數(shù)組對(duì)象中
  @RequestMapping("/arrayParam")
  @ResponseBody
  public String arrayParam(String[] likes) {
    System.out.println("數(shù)組參數(shù)傳遞 likes ==> " + Arrays.toString(likes));
    return "{'module':'array param'}";
}

集合類型參數(shù)

數(shù)組能接收多個(gè)值,那么集合是否也可以實(shí)現(xiàn)這個(gè)功能呢? 發(fā)送請(qǐng)求和參數(shù):

1669802154677_16.png

后臺(tái)接收參數(shù)

//集合參數(shù):同名請(qǐng)求參數(shù)可以使用@RequestParam注解映射到對(duì)應(yīng)名稱的集合對(duì)象中作為數(shù)據(jù)
@RequestMapping("/listParam")
@ResponseBody
public String listParam(List < String > likes) {
    System.out.println("集合參數(shù)傳遞 likes ==> " + likes);
    return "{'module':'list param'}";
}

運(yùn)行會(huì)報(bào)錯(cuò),

1669802264051_71.png

錯(cuò)誤的原因是:SpringMVC將List看做是一個(gè)POJO對(duì)象來(lái)處理,將其創(chuàng)建一個(gè)對(duì)象并準(zhǔn)備把前端的數(shù) 據(jù)封裝到對(duì)象中,但是List是一個(gè)接口無(wú)法創(chuàng)建對(duì)象,所以報(bào)錯(cuò)。 解決方案是:使用@RequestParam注解

//集合參數(shù):同名請(qǐng)求參數(shù)可以使用@RequestParam注解映射到對(duì)應(yīng)名稱的集合對(duì)象中作為數(shù)據(jù)
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List < String > likes) {
    System.out.println("集合參數(shù)傳遞 likes ==> " + likes);
    return "{'module':'list param'}";
}

集合保存普通參數(shù):請(qǐng)求參數(shù)名與形參集合對(duì)象名相同且請(qǐng)求參數(shù)為多個(gè),@RequestParam綁定參數(shù)關(guān)系。對(duì)于簡(jiǎn)單數(shù)據(jù)類型使用數(shù)組會(huì)比集合更簡(jiǎn)單些。


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!