簡體   English   中英

將值傳遞給Spring MVC中的控制器,有什么區別?

[英]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要求提供nameage參數,並且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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM