[SpringBoot]@RequestParam和@PathVariable的用法與區別

一、SpringBoot——@PathVariable

URL變量
    Web應用中的URL通常不是一成不變的,例如微博兩個不同用戶的個人主頁對應兩個不同的URL:
http://weibo.com/user1http://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

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