一、SpringBoot——@PathVariable
URL變量
Web應用中的URL通常不是一成不變的,例如微博兩個不同用戶的個人主頁對應兩個不同的URL:
http://weibo.com/user1
和http://weibo.com/user2
。我們不能對於每一個用戶都編寫一個被@RequestMapping
註解的方法來處理其請求,也就是說,對於相同模式的URL(例如不同用戶的主頁,他們僅僅是URL中的某一部分不同,爲他們各自的用戶名,我們說他們具有相同的模式)。
定義URL變量規則
可以在@RequestMapping註解中用{ }來表明它的變量部分,例如:
@RequestMapping(value="/user/{username}")
這裏的{username}就是我們定義的變量規則,username是變量的名字,那麼這個URL路由可以匹配下列任意URL並進行處理:
- /user/Tom
- /user/Jerry
- /user/Jack2
需要注意的是,在默認情況下,變量中不可以包含URL的分隔符/
,例如路由不能匹配/user/Denny/Jon
,即使你認爲Denny/Jon
是一個存在的用戶名。
獲取URL變量
在路由中定義變量規則後,通常我們需要在處理方法(也就是@RequestMapping註解的方法)中獲取這個URL的具體值,並根據這個值(例如用戶名)做相應的操作,SpringMVC提供的@PathVariable
可以幫助我們:
@RequestMapping(value="/user/{username}")
public String userProfile(@PathVariable(value="username") String username) {
return "user"+username;
}
在上面的例子中,當@Controller處理HTTP請求時,userProfile的參數username會自動設置爲URL中對應變量username(同名賦值)的值。例如,當HTTP請求爲/user/fpc
,URL變量username的值fpc就會被賦值給函數參數username,函數的返回值是userfpc。
在默認情況下,Spring會對@PathVariable註解的變量進行自動賦值,也可以指定@PathVariable使用哪一個URL中的變量:
運行結果:
可以定義多個URL變量
可以定義URL路由,其中包含多個URL變量:
@RequestMapping(value = "/user/{username}/blog/{blogId}")
public String getUserBlog(@PathVariable String username, @PathVariable int blogId) {
return "user:" + username + "blog->" + blogId;
}
這種情況下,Spring能夠根據名字自動賦值對應的函數參數值,當然也可以在@PathVariable
中顯示地表明具體的URL變量值。
在默認情況下,@PathVariable註解的參數可以是一些基本的簡單類型:int,long,Date,String等,Spring能夠根據URL變量的具體值及函數參數類型來進行轉換。例如/user/fpc/blog/1
,會將fpc的值賦給username,而1賦給int變量blogId。
運行結果:
匹配正則表達式
很多時候,需要對URL變量進行更加精確的定義。例如,用戶名只可能包含大小寫字母,數字,下劃線,我們希望:
/user/fpc
是一個合法的URL/user/#$$$
則是一個不合法的URL
除了簡單地定義{username}變量,還可以定義正則表達式進行更精確地控制,定義語法是{變量名: 正則表達式}。[a-zA-Z0-9_]+是一個正則表達式,表示只能包含小寫字母,大寫字母,數字,下劃線。如此設置URL變量規則後,不合法的URL則不會被處理,直接由SpringMVC框架返回404NotFound
。
@RequestMapping(value = "/user/{username: [a-zA-Z0-9]+}/blog/{blogId}")
二、SpringBoot——@RequestParam
request參數
在訪問各種各樣的網站時,經常會發現網站的URL的最後一部分形如:
?xx=yy&zz=ww
。這是HTTP協議中的Request參數,它有什麼用呢?先看一個例子:
- 在知乎中搜索web
- 瀏覽器跳轉到新頁面後,URL變爲https://www.zhihu.com/search?type=content&q=web
- 在知乎中搜索java
- 瀏覽器跳轉到新頁面後,URL變爲https://www.zhihu.com/search?type=content&q=java
這裏的type=content&q=web
就是搜索請求的參數,不同參數之間用&分隔,每個參數形如name=value的形式,分別表示參數名字和參數值。在這個例子中,我們輸入不同的搜索關鍵詞,在搜索結果頁面的URL的q參數是不同的。也就是說,HTTP參數實際上可以認爲是一種用戶的輸入,根據不同的用戶輸入,服務器經過處理後返回不同的輸出(例如搜索spring和搜索java,顯示結果是不一樣的)。
Spring MVC中的Request參數
在SpringMVC框架中,可以通過定義@RequestMapping來處理URL請求。和@PathVariable
一樣,需要在處理URL的函數中獲取URL中的參數,也就是?key1=value1&key2=value2
這樣的參數列表。通過註解@RequestParam
可以輕鬆地將URL中的參數綁定到處理函數方法的變量中:
@RequestMapping(value="/user")
public String getUserBlog(@RequestParam(value="id") int blogId) {
return "blogId="+blogId;
}
這樣,當我們訪問/user/?id=123
時,SpringMVC幫助我們將Request參數id的值綁定到了處理函數的參數blogId上。這樣就能夠輕鬆獲取用戶輸入,並根據它的值進行計算並返回了。
運行結果:
三、@RequestParam和@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(value = "id", required = false)
當然,在參數不存在的情況下,可能希望變量有一個默認值:
@RequestParam(value = "id", required = false, defaultValue = "0")
題外小知識:
代碼塊樣式可以在創作中心--->博客設置--->代碼塊片樣式
更改
原文鏈接:https://blog.csdn.net/a15028596338/article/details/84976223