在springmvc背景控制層擷取參數的方式主要有兩種,一種是request.getparameter("name"),另外一種是用注解@requestparam直接擷取。這裡主要講這個注解
一、基本使用,擷取送出的參數
後端代碼:

@requestmapping("testrequestparam")
public string filesupload(@requestparam string inputstr, httpservletrequest request) {
system.out.println(inputstr);
int inputint = integer.valueof(request.getparameter("inputint"));
system.out.println(inputint);
// ......省略
return "index";
}
前端代碼:

<form action="/gadget/testrequestparam" method="post">
參數inputstr:<input type="text" name="inputstr">
參數intputint:<input type="text" name="inputint">
</form>
前端界面:
執行結果:
test1
123
可以看到spring會自動根據參數名字封裝進入,我們可以直接拿這個參數名來用
二、各種異常情況處理
1、可以對傳入參數指定參數名

@requestparam string inputstr
// 下面的對傳入參數指定為aa,如果前端不傳aa參數名,會報錯
@requestparam(value="aa") string inputstr
錯誤資訊:
http status 400 - required string parameter 'aa' is not present
2、可以通過required=false或者true來要求@requestparam配置的前端參數是否一定要傳

// required=false表示不傳的話,會給參數指派為null,required=true就是必須要有
public string filesupload(@requestparam(value="aa", required=true) string inputstr, httpservletrequest request)
3、如果用@requestmapping注解的參數是int基本類型,但是required=false,這時如果不傳參數值會報錯,因為不傳值,會指派為null給int,這個不可以

public string filesupload(@requestparam(value="aa", required=true) string inputstr,
@requestparam(value="inputint", required=false) int inputint
,httpservletrequest request) {
}
解決方法:
“consider declaring it as object wrapper for the corresponding primitive type.”建議使用包裝類型代替基本類型,如使用“integer”代替“int”
<b>另————————————————————————————————————————————————————————————————————</b>
<b></b>
@mvc另外一個特性是其提取和解析請求參數的能力。讓我們繼續重構上面的方法,并在其中添加@requestparam注解:
@requestmapping("/accounts/show")
public void show(@requestparam("number") string number, map<string, object> model) {
model.put("account", accountrepository.findaccount(number));
}
這裡@requestparam注解可以用來提取名為“number”的string類型的參數,并将之作為輸入參數傳入。 @requestparam支援類型轉換,還有必需和可選參數。類型轉換目前支援所有的基本java類型,你可通過定制的propertyeditors 來擴充它的範圍。下面是一些例子,其中包括了必需和可選參數:
@requestparam(value="number", required=false) string number
@requestparam("id") long id
@requestparam("balance") double balance
@requestparam double amount
注意,最後一個例子沒有提供清晰的參數名。當且僅當代碼帶調試符号編譯時,結果會提取名為“amount ”的參數,否則,将抛出illegalstateexception異常,因為目前的資訊不足以從請求中提取參數。由于這個原因,在編碼時最好顯式的指定參數名。
三種寫法,test(string name),
test(@requestparam string name),
test(@requestparam("username") string name),
第一種如果沒有name 參數不會報錯,
第二種沒有name 參數會報錯,(也可以設定required = false),
第三種跟第二種的差別是name 參數換為username。