[英]Pass value to controller in Spring MVC, what is the difference?
當我在一個舊項目中閱讀一些用Spring MVC編寫的代碼時,我注意到作者使用兩種類似的方法將值傳遞給控制器,如下所示:
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam("name") String name,@RequestParam("age") int age) {
.......
}
要么
@RequestMapping(value="/print")
public String PrintInfo(String name,int age) {
.......
}
他們倆都運作良好。 區別在於是否使用@RequestParam。
那么它們之間的主要區別是什么? 哪一個更好,為什么?
基本上,這聽起來像是您在問“什么是RequestParam
,為什么要使用它?”
RequestParam允許您將方法參數參數綁定到Web請求參數。 如果沒有其他任何屬性,您的示例將告訴Spring要求提供name
和age
參數,並且Spring將知道將這兩個參數與傳入的請求相關聯。 您可以選擇將required
設置為false
以使參數成為可選參數:
public String PrintInfo(@RequestParam("name", required = false) String name,
@RequestParam("age") int age) {
作為一項非常有用的功能,如果您從請求中收到一個空值,還可以提供defaultValue
。 因此,您可以執行以下操作:
public String PrintInfo(@RequestParam("name", defaultValue="John Doe") String name,
@RequestParam("age") int age) {
...而且您將永遠不會使用空名稱。
最后,使用它還會執行一些魔術類型轉換,例如自動使用Integer
類型。 在您的示例中,您可能使用了:
public String PrintInfo(@RequestParam("name") String name,
@RequestParam("age") Integer age) {
...而Spring會自動將其裝箱,無需您進行任何額外的工作。
放棄RequestParam
批注並沒有本質上的錯誤,但是實際上,您拒絕對Spring啟用這些功能(就像在第二種情況下一樣)表示不接受。
在旁邊:
@RequestMapping(value="/print")
可以更簡單地寫為@RequestMapping("/print")
如果請求參數的名稱和方法參數的名稱相等,則Spring將按名稱自動綁定參數。 例如,您有傳入的GET
請求:
http://localhost:8080/print?name=somename&age=30
和控制器方法:
@RequestMapping(value="/print")
public String PrintInfo(String name,int age) {
...
}
在這種情況下,您不需要為參數指定@RequestParam
批注。 因為請求中的名稱與方法args的名稱相等。
但是,當名稱不相等時,則需要使用@RequestParam
顯式指定名稱的對應關系。 例如:
http://localhost:8080/print?user_name=somename&user_age=30
和控制器方法:
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam("user_name") String userName, @RequestParam("user_age")int userAge) {
...
}
因此,當請求參數名稱和方法args名稱不同時,@ @RequestParam
需要幫助Spring正確進行綁定。
因此,即使名稱相同,許多開發人員也始終使用@RequestParam
。 例如空的@RequestParam
:
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam() String name, @RequestParam() int age) {
...
}
因為此批注顯示參數來自請求,並使您的代碼更清晰易讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.