昨天同事問我控制器參數的注解的問題,我好久沒那樣寫過,把參數和url一起設置,不過,今天我看了一些文章,查了一些資料,我盡可能的用我自己的理解方式來解釋它吧!
1.@RequestParam綁定單個請求參數值
@RequestParam用於將請求參數區數據映射到功能處理方法的參數上。
[java] view plain copy public String requestparam1(@RequestParam String username)
請求中包含username參數(如/requestparam1?username=zhang),則自動傳入。
此處要特別注意:右擊項目,選擇“屬性”,打開“屬性對話框”,選擇“Java Compiler”然后再打開的選項卡將“Add variable attributes to generated class files”取消勾選,意思是不將局部變量信息添加到類文件中,如圖6-12所示:

圖6-12
當你在瀏覽器輸入URL,如“requestparam1?username=123”時會報如下錯誤
Name for argument type [java.lang.String] not available, and parameter name information not found in class file either,表示得不到功能處理方法的參數名,此時我們需要如下方法進行入參:
[java] view plain copy public String requestparam2(@RequestParam("username") String username)
即通過@RequestParam("username")明確告訴Spring Web MVC使用username進行入參。
@RequestParam注解主要有哪些參數:
value:參數名字,即入參的請求參數名字,如username表示請求的參數區中的名字為username的參數的值將傳入;
required:是否必須,默認是true,表示請求中一定要有相應的參數,否則將報404錯誤碼;
defaultValue:默認值,表示如果請求中沒有同名參數時的默認值,默認值可以是SpEL表達式,如“#{systemProperties['java.vm.version']}”。
[java] view plain copy public String requestparam4(@RequestParam(value="username",required=false) String username)
表示請求中可以沒有名字為username的參數,如果沒有默認為null,此處需要注意如下幾點:
原子類型:必須有值,否則拋出異常,如果允許空值請使用包裝類代替。
Boolean包裝類型類型:默認Boolean.FALSE,其他引用類型默認為null。
[java] view plain copy public String requestparam5( @RequestParam(value="username", required=true, defaultValue="zhang") String username)
表示如果請求中沒有名字為username的參數,默認值為“zhang”。
如果請求中有多個同名的應該如何接收呢?如給用戶授權時,可能授予多個權限,首先看下如下代碼:
[java] view plain copy public String requestparam7(@RequestParam(value="role") String roleList)
如果請求參數類似於url?role=admin&rule=user,則實際roleList參數入參的數據為“admin,user”,即多個數據之間使用“,”分割;我們應該使用如下方式來接收多個請求參數:
public String requestparam7(@RequestParam(value="role") String[] roleList)
或
public String requestparam8(@RequestParam(value="list") List<String> list)
2.@PathVariable綁定URI模板變量值
@PathVariable用於將請求URL中的模板變量映射到功能處理方法的參數上。
1 @RequestMapping(value="/users/{userId}/topics/{topicId}") 2 public String test( 3 @PathVariable(value="userId") int userId, 4 @PathVariable(value="topicId") int topicId)
如請求的URL為“控制器URL/users/123/topics/456”,則自動將URL中模板變量{userId}和{topicId}綁定到通過@PathVariable注解的同名參數上,即入參后userId=123、topicId=456
所以,關於控制器參數,先介紹這么多。
