SpringBoot Web專案的引數繫結:URL傳參及預設引數設定
一、@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
結果:
傳了空值到頁面,無法繫結