天天看點

SpringMVC注解@RequestParam全面解析

在springmvc背景控制層擷取參數的方式主要有兩種,一種是request.getparameter("name"),另外一種是用注解@requestparam直接擷取。這裡主要講這個注解 

一、基本使用,擷取送出的參數 

後端代碼: 

SpringMVC注解@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";  

   }     

前端代碼: 

SpringMVC注解@RequestParam全面解析

<form action="/gadget/testrequestparam" method="post">    

     參數inputstr:<input type="text" name="inputstr">    

     參數intputint:<input type="text" name="inputint">    

</form>  

前端界面: 

SpringMVC注解@RequestParam全面解析

執行結果: 

test1 

123 

可以看到spring會自動根據參數名字封裝進入,我們可以直接拿這個參數名來用 

二、各種異常情況處理 

1、可以對傳入參數指定參數名 

SpringMVC注解@RequestParam全面解析

@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配置的前端參數是否一定要傳 

SpringMVC注解@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,這個不可以 

SpringMVC注解@RequestParam全面解析

   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&lt;string, object&gt; 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。