溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring中的PathVariable注釋怎么用

發(fā)布時間:2021-10-25 16:27:43 來源:億速云 閱讀:178 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Spring中的PathVariable注釋怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Spring的PathVariable注釋

就像@RequestParam一樣,@PathVariable批注用于從HTTP request中提取數(shù)據(jù)。但是,它們略有不同。區(qū)別在于@RequestParam從URL獲取參數(shù),而@PathVariable只是從URI中提取參數(shù)。

例子

讓我們假設(shè)你有一個以下 URL 的網(wǎng)站:

http://www.yourwebsite.net/employee/1

上面 URL 中的1表示雇員的 ID。 到目前為止一切ok。 但是現(xiàn)在,從 Spring 控制器看,路徑看起來是這樣的(取決于您給 id 的名稱) :

/employee/{id}

上面的 URL 路徑對我們有什么幫助? 因為這個{}語法(碰巧被稱為 URI 模板) ,你現(xiàn)在可以把它傳遞給一個使用@pathvariable 的方法,你的方法和注釋看起來如下所示:

@RequestMapping(value="/employee/{id}", method=RequestMethod.GET)
<Access Modifier> <Return Type> <Method Name> (@PathVariable <Type> id) { <body> }

從上面的代碼片段可以看到,現(xiàn)在“ id”將從路徑中引用{ id }。 讓我們用一個真實的例子來嘗試:

@Controller
@SpringBootApplication
public class EmployeeManager {
   @RequestMapping(value=" /employee/{id}")
   public String pathVariableDemo(Model model, @PathVariable int id) {
      model.addAttribute("id", id);
      return "demo";
   }
}

現(xiàn)在,Spring查看輸出id參數(shù),并將其與模板變量“ id”進(jìn)行匹配。

請記住,如果我的代碼使用“ id”(參數(shù))命名為其他名稱,那么它將無法工作。 然而,如果你不想對參數(shù)和模板變量使用相同的名字,你可以像這樣命名 PathVariable 注釋的名字:

@Controller
@SpringBootApplication
public class EmployeeManager {
   @RequestMapping(value=" /employee/{id}")
   public String pathVariableDemo(Model model, @PathVariable("id") int someRandomName) {
      model.addAttribute("id", someRandomName);
      return "demo";
   }
}

從上面的示例中可以看到,我將參數(shù)的名稱更改為 _someRandomName,_但還添加了@PathVariable (“ id”),它再次指定了我們要引用的模板變量。

最終您有兩個選擇:

  • 1.為方法參數(shù)使用相同的名稱

  • 2.在@PathVariable批注中指定模板變量的名稱

多個@PathVariable批注

如果你可以有多個@pathvariable 會怎么樣? 我們能做到嗎? 是的,我們可以! 事實上,這和添加一個@pathvariable 非常相似。

我們來演示一下:

@Controller
@SpringBootApplication
public class EmployeeManager {
   @RequestMapping(value="/{company}/employee/{id}", method=RequestMethod.GET)
   public String pathVariableDemo(@PathVariable("company") String companyName, @PathVariable("id") int employeeId) {
      // handle the code
      return "demo";
   }
}

從上面的代碼片段中可以看到,我們有兩個模板變量:

  • company

  • id

然后,我們提取每個模板變量,然后通過指定方法參數(shù)所引用的臨時變量將它們“分配”給方法參數(shù)。

@PathVariable vs @RequestParam結(jié)論

盡管@PathVariable和@RequestParam都用于從URL提取值,但是可以根據(jù)URL的設(shè)計使用它們。

通常,@PathVariable通常用于RESTful Web服務(wù)中,而@RequestParam用于從查詢參數(shù)中提取數(shù)據(jù)。

使用@PathVariable的坑

發(fā)現(xiàn)問題

前端路徑拼接用戶名,因為用戶名中是帶'.‘這個字符的。類似'Oliver.wang'。前端瀏覽器F12,發(fā)現(xiàn)路徑正常拼接'xxxxxx/Oliver.wang?xxx=xxx',后端代碼發(fā)現(xiàn),controller層的參數(shù),接收到只有'Oliver'。

解決過程

在方法中多加了一個參數(shù)(xxx,HttpServletRequest request){},輸出request.ServletPath(),發(fā)現(xiàn)路徑正常'/xxx/xxx/Oliver.wang'。

解決方案

  • 第一種:加上 {:.+} ,比如 @getMapping(“xxx/{name:.+}”)

  • 第二種:UrlEncode

  • 第三種:request.ServletPath() 拿到路徑截取字符串

  • 第四種:不拼接路徑,改成'xxxxx?name=Oliver.wang' 請求參數(shù)

以上是“Spring中的PathVariable注釋怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI