SpringBoot-@RequestParam 比較

Request參數

在訪問各種各樣網站時,經常會發現網站的URL的最後一部分形如:?xxxx=yyyy&zzzz=wwww。這就是HTTP協議中的Request參數,它有什麼用呢?先來看一個例子:

  • 在知乎中搜索web
  • 瀏覽器跳轉到新頁面後,URL變爲https://www.zhihu.com/search?type=content&q=web

這裏type=content&q=web就是搜索請求的參數,不同參數之間用&分隔,每個參數形如name=value形式,分別表示參數名字和參數值。在這個例子中,我們輸入不同的搜索關鍵詞,在搜索結果頁面的URL的q參數是不同的,也就是說,HTTP參數實際上可以認爲是一種用戶的輸入,根據不同的用戶輸入,服務器經過處理後返回不同的輸出(例如搜索spring和搜索java,顯示結果是不一樣的。)

Spring MVC中的Request參數

在SpringMVC框架中,現在我們已經可以通過定義@RequestMapping來處理URL請求了,和@PathVariable一樣,我們也需要再處理URL的函數中獲取URL中的參數-也就是?key=value1&key2=value2這樣的參數列表。通過註解@RequestParam可以輕鬆的將URL中的參數綁定到處理函數方法的變量中:

  @RequestMapping("/user")
    @ResponseBody
//    public String getUerBlog(@PathVariable String username , @PathVariable int blogId) {
//        return "user: " + username + "blog->" + blogId;
//    }
    public String getUserBlog(@RequestParam("id") int blogId) {
        return "blogId = " + blogId;
    }

這樣當我們訪問/user/?id=123時,Spring MVC幫助我們將Request參數id的值綁定到了處理函數的參數blogId上。這樣就能夠輕鬆獲取用戶輸入,並根據它的值進行計算並返回了。

運行結果:

@RequestParam vs @PathVariable

相信大家可能注意到了,@RequestParam和@PathVariable都能夠完成類似的功能——因爲本質上,它們都是用戶的輸入,只不過輸入的部分不同,一個在URL路徑部分,另一個在參數部分。要訪問一篇博客文章,這兩種URL設計都是可以的:

  • 通過@PathVariable,例如/blogs/1
  • 通過@RequestParam,例如blogs?blogId=1

那麼究竟應該選擇哪一種呢?建議:

  1. 當URL指向的是某一具體業務資源(或者資源列表),例如博客,用戶時,使用@PathVariable
  2. 當URL需要對資源或者資源列表進行過濾,篩選時,用@RequestParam

例如我們會這樣設計URL:

  • /blogs/{blogId}
  • /blogs?state=publish而不是/blogs/state/publish來表示處於發佈狀態的博客文章

更多用法

一旦我們在方法中定義了@RequestParam變量,如果訪問的URL中不帶有相應的參數,就會拋出異常——這是顯然的,Spring嘗試幫我們進行綁定,然而沒有成功。但有的時候,參數確實不一定永遠都存在,這是我們可以通過定義required屬性:

@RequestParam(name="id",required=false)

當然,在參數不存在的情況下,可能希望變量有一個默認值:

@RequestParam(name="id",required=false,defaultValue="0")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章