一、@RequestParam

這個註解用來繫結單個請求資料,既可以是url中的引數,也可以是表單提交的引數和上傳的檔案

它有三個屬性,value用於設定引數名,defaultValue用於對引數設定預設值,required為true時,如果引數為空,會報錯

好,下面展示具體例子:

首先是vm:

1
2
<h1>param1:${param1}</h1>
<h1>param2:${param2}</h1>

好吧,就為了展示兩個引數

第一種情況:

1
2
3
4
5
6
@RequestMapping(value = "/hello1.htm")
public String hello1(ModelMap modelMap,Integer param1, int param2) {
modelMap.addAttribute("param1", param1);
modelMap.addAttribute("param2", param2);
return "hello";
}

這裡前面的引數時包裝型,後面的引數時原始型別

直接用url請求:

http://localhost:8080/hello1.htm?param1=1¶m2=2

結果:

但是:

如果不傳param2:  

http://localhost:8080/hello1.htm?param1=1

直接就報錯了

因為無法將null轉換為原始型別

所以:建議所有的引數都用包裝型別,別用原始型別

第二種情況:

仍然是上面的那個controller,地址改為

http://localhost:8080/hello1.htm?param2=1¶m1=2

就是讓param2=1,param1=2,想試驗下,引數繫結是和順序有關,還是隻和引數名稱有關,結果:

所以,springMvc引數繫結只和引數名字有關係

 

第三種情況:

如果頁面上表單裡的引數和程式碼裡的引數名不一樣怎麼辦,這時候就可以用註解了: 

1
2
3
4
5
6
@RequestMapping(value = "/hello1.htm")
public String hello1(ModelMap modelMap, @RequestParam(value = "paramTest") Integer param1, Integer param2) {
modelMap.addAttribute("param1", param1);
modelMap.addAttribute("param2", param2);
return "hello";
}

在param1前面加上了註解,這時候第一個引數只接受paramTest名字的引數,param1此時無效了。

如果此時我們這麼請求:

http://localhost:8080/hello1.htm?param1=1¶m2=2

spring直接報錯,必須要這麼請求了:

http://localhost:8080/hello1.htm?paramTest=1¶m2=2

結果:

 

 第四種情況:

有時候頁面上的表單客戶不填任何值,但是在控制器裡希望它有預設值

可以這樣:

1
2
3
4
5
6
@RequestMapping(value = "/hello1.htm")
public String hello1(ModelMap modelMap, @RequestParam(defaultValue = "5") Integer param1, Integer param2) {
modelMap.addAttribute("param1", param1);
modelMap.addAttribute("param2", param2);
return "hello";
}

這裡用了RequestParam的defaultValue屬性,如果url引數中沒傳param1,也不會報錯,使用預設值,比如我們這麼請求:

http://localhost:8080/hello1.htm?param2=2

結果:

 

但是,如果url中對param1賦值了:

http://localhost:8080/hello1.htm?param1=3¶m2=2

結果:

 

也就是說,我們賦的值會修改預設值

第五種情況:

RequestParam還有個屬性:required

意思是必須傳值,否則報錯,就是這麼任性

1
2
3
4
5
6
@RequestMapping(value = "/hello1.htm")
public String hello1(ModelMap modelMap, @RequestParam(required = true) Integer param1, Integer param2) {
modelMap.addAttribute("param1", param1);
modelMap.addAttribute("param2", param2);
return "hello";
}

但是當required=true,和defaultValue= 同時出現時,required失效,可傳可不傳

簡單型別引數繫結小結:

springMVC預設根據引數名字來繫結,而不是引數位置

使用包裝型別,否則如果不傳值,會報錯

使用@RequestParam(value="")來改變引數名字

使用@RequestParam(defaultValue=""),不傳參時,使用預設值

使用@RequestParam(required=true),強制必須傳引數

 二、@PathVariable

用這個註解可以將URL中的佔位符引數繫結到控制器處理方法的入參中,可以這樣用:

1
2
3
4
5
6
7
8
@RequestMapping("/hello2.htm/{param1}/{param2}")
public String hello2(ModelMap modelMap, @PathVariable Integer param1, @PathVariable Integer param2) {
System.out.println("進入了hello2控制器");
System.out.println(param1 + "," + param2);
modelMap.addAttribute("param1", param1);
modelMap.addAttribute("param2", param2);
return "hello";
}

URL:

http://localhost:8080/hello2.htm/1/2

結果:

 

如果不加PathVariable註解,是無法繫結的

1
2
3
4
5
6
7
8
@RequestMapping("/hello2.htm/{param1}/{param2}")
public String hello2(ModelMap modelMap,Integer param1, @PathVariable Integer param2) {
System.out.println("進入了hello2控制器");
System.out.println(param1 + "," + param2);
modelMap.addAttribute("param1", param1);
modelMap.addAttribute("param2", param2);
return "hello";
}

去掉了第一個引數的註解:

http://localhost:8080/hello2.htm/1/2

結果:

 

傳了空值到頁面,無法繫結