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
那麼究竟應該選擇哪一種呢?建議:
- 當URL指向的是某一具體業務資源(或者資源列表),例如博客,用戶時,使用@PathVariable
- 當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")