主題
- 如何在SpringMVC controller中獲取請(qǐng)求request 里的參數(shù) request parameter
- 如何將請(qǐng)求參數(shù)綁定到不同的參數(shù)對(duì)象
- 如何使用@RequestParam阅爽,并且知曉何時(shí)不需要該注解
- 以下案例都是get 請(qǐng)求獲取request 參數(shù)
- 且要明白request上的請(qǐng)求參數(shù) 都是以String形式pass的森书,Spring需要做很多中間處理艾船,將String類型的值轉(zhuǎn)成Controller中你設(shè)定的目的類型
@RequestParam 案例
@Requestparam 注解用來(lái)建立 方法參數(shù)(method param)與請(qǐng)求參數(shù)(request param)的對(duì)應(yīng)關(guān)系
1. 綁定方法參數(shù)與請(qǐng)求參數(shù)的對(duì)應(yīng)關(guān)系
- url: /books?category=java //參數(shù)category 不可缺
- Controller 代碼
@RequestMapping("/books")
//@RequestParam("category") 建立 url中 請(qǐng)求參數(shù)-category 和 方法參數(shù)-cat 之間的對(duì)應(yīng)關(guān)系
//注:當(dāng)請(qǐng)求參數(shù)和方法參數(shù)同名時(shí)捻激,可省略@RequestParam中的value 值-自動(dòng)綁定
public String books(@RequestParam("category") String cat) {
//bussiness logic
sout("category " + cat)
return "book.jsp";
}
2. 自動(dòng)類型轉(zhuǎn)換
當(dāng)Request Param 不是 String類型如而是 number時(shí),我們可自動(dòng)將其轉(zhuǎn)成 number類型的 method 參數(shù)
- url: /books?rate=5&maxprice=150.55
- 目的:將rate轉(zhuǎn)成int,將 maxprice 轉(zhuǎn)成 BigDecimal
@RequestParam("category")
//只需直接指定想要轉(zhuǎn)變成的類型,如 rate 為 int翎卓,maxprice 為 BigDecimal
public String books(@RequestParam("rate") int rate,
@RequestParm("maxprice") BigDecimal maxprice) {
//bussiness logic
sout("rate " + rate +", maxprice " + maxprice)
return "book.jsp";
}
3. request參數(shù)為日期類型
- url: /books?from=2012-01-12
- 目的:想傳遞一個(gè)日期類型,且controller自動(dòng)將字符串“2012-01-12” 轉(zhuǎn)成controller方法參數(shù)中日期格式
@RequestMapping("/books")
public String books(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@RequestParam("from") LocalDate from) {
//首先用 @DateTimeFormat注解摆寄,而且是用其中的ISO.DATE做格式轉(zhuǎn)化, DATE 標(biāo)識(shí):yyyy-MM-dd
//再用LocalDate格式做參數(shù)失暴,LocalDate 標(biāo)識(shí):year-month-day
//java.util.Date:年 月 日 hh mm ss
System.out.println("from " + from);
return "book.jsp";
}
4. request 參數(shù)為不必須
- url: /books?category=math
- category 不是必須的
@RequestMapping("/books")
public String books(@RequestParam("category", required=false) String cat) {
//@RequestParam 默認(rèn)required = true坯门,為false時(shí) 該參數(shù)不必須
System.out.println("category " + cat);
return "book.jsp";
}
5. request 自帶默認(rèn)值, 用于以下1/2種場(chǎng)景
- url1: /books? //輸出:history --category 為 null, required 可以為 false
- url2: /books?category= //輸出:history --category 為 null
- url3: /books?category="" // 輸出:""
@RequestMapping("/books")
public String books(@RequestParam("category", defaultValue="history") String cat) {
System.out.println("category " + cat);
return "book.jsp";
}
6. @RequestParam 為L(zhǎng)ist or array
- url: /books?authors=zhangsi&authors=lisi
- request 中同名的參數(shù)將自動(dòng)轉(zhuǎn)化成 controller 中的@RequestParam List ,必要時(shí)可用 value 屬性指定參數(shù)名
- 方法參數(shù)寫成 String[] 也可以
@RequestMapping("/books")
public String books(@RequestParam List<String> authors) {
System.out.println("authors " + authors);
return "book.jsp";
}
7. @RequestParam 為Map,一個(gè)key 對(duì)應(yīng)一個(gè)value值
- url: /books?category=math&authors=lisi
- controller 參數(shù)在這種情況下不能通過(guò) @RequestParam的value指定具體request 參數(shù)名
- controller參數(shù)類型 為 Map 就出現(xiàn)了一個(gè) 誰(shuí)是 Key逗扒,誰(shuí)是Value的問(wèn)題,這個(gè)是自動(dòng)裝配
- 根據(jù)requet 參數(shù)請(qǐng)求順序古戴,前面的為 key , 后面的為 value
@RequestMapping("/books")
public String books(@RequestParam Map<String, String> book) {
System.out.println("book " + book);
return "book.jsp";
}
輸出:{category=math, authors=lisi}
8. @RequestParam 為MultiValueMap,一個(gè)key 對(duì)應(yīng)一個(gè)多個(gè) value 值
- url: /books?category=math&authors=lisi&authors=zhangsi
- 參數(shù)同樣具有順序性矩肩,第一個(gè)為key, 其余同名參數(shù)封裝為 value
@RequestMapping("/books")
public String books(@RequestParam MultiValueMap<String, List<String>> book ) {
System.out.println("book " + book);
return "book.jsp";
}
輸出:{category=[math], authors=[lisi, zhangsi]}
9. 不聲明 @RequestParam
- url: /books?category=math
- 默認(rèn) request 和 controller 方法參數(shù)同名现恼,可省略 @RequestParam
@RequestMapping("/books")
public String books(String category) {
System.out.println("category " + category);
return "book.jsp";
}
輸出:math
建議:指明 @RequestParam
10. request 參數(shù)為field, 而 controller 參數(shù)為 Object
- url: /books?category=math&author=lisi
- Object 對(duì)象 封裝了兩個(gè)field: category, author
- 這個(gè)轉(zhuǎn)換非常有用,尤其是多request 參數(shù)轉(zhuǎn)成封裝對(duì)象時(shí)
- 注意此時(shí)是無(wú)@RequestParam的蛮拔,有則400
public class Box{
String category;
String author;
getter;
setter;
String toString() {
return "category=" + category +", author=" + author;
}
}
@RequestMapping("/books")
public String books(Box box ) {
System.out.println("box " + box);
return "book.jsp";
}
輸出:category=math, author=lisi
注意
- 以上 @RequestMapping 省略掉method 屬性述暂,則說(shuō)明所匹配的方法 可以接受任何請(qǐng)求,PUT/GET/DELETE/POST建炫,并非默認(rèn)為GET
- 當(dāng)method 為 PUT/POST/DELTE時(shí)畦韭,url 中仍可以用"**?name=lisi" 傳遞參數(shù),因?yàn)镻OSTMAN中這些方法沒(méi)有parameter選項(xiàng)肛跌,直接寫在url中即可