我有一個簡單的控制器,看起來像這樣: -瞭解Spring MVC的@RequestMapping POST如何運作
@Controller
@RequestMapping(value = "/groups")
public class GroupsController {
// mapping #1
@RequestMapping(method = RequestMethod.GET)
public String main(@ModelAttribute GroupForm groupForm, Model model) {
...
}
// mapping #2
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String changeGroup(@PathVariable Long id, @ModelAttribute GroupForm groupForm, Model model) {
...
}
// mapping #3
@RequestMapping(method = RequestMethod.POST)
public String save(@Valid @ModelAttribute GroupForm groupForm, BindingResult bindingResult, Model model) {
...
}
}
基本上,此頁面具有以下功能: -
- 用戶訪問主頁(
/groups GET
)。 - 用戶創建一個新組(
/groups POST
)或選擇特定組(/groups/1 GET
)。 - 用戶編輯現有組(
/groups/1 POST
)。
我明白這兩個GET請求映射是如何工作的。定義映射#2,否則(/groups/1 GET
)將導致「找不到映射」異常。
我在這裏試圖理解的是爲什麼映射#3同時處理(/groups POST
)和(/groups/1 POST
)?由於請求映射與URI匹配,所以它應該在這裏處理(/groups POST
)是有意義的。爲什麼(/groups/1 POST
)不會在此處引發「找不到映射」異常?事實上,它幾乎看起來像URI以/組開頭的任何POST(例如:/groups/bla/1 POST
)也將通過映射#3進行處理。
有人可以向我提供一個清晰的解釋嗎?非常感謝。
澄清
我明白一個事實,我可以用更適當的方法(如GET,POST,PUT或DELETE)......或者我可以創建另一個請求映射到處理/groups/{id} POST
。
不過,我想知道的就是......
.... 「爲什麼映射#3手柄/groups/1 POST
嗎?」
「最接近的匹配」的理由似乎並不成立的,因爲如果我刪除映射#2,那麼我想映射#1將處理/groups/1 GET
,但它沒有做,它會導致一個「找不到映射「例外。
我只是有點難倒在這裏。
爲什麼不使用PUT對資源的更新?這將是正確的HTTP協議。 – 2012-03-16 14:23:44
Web表單提交只支持GET和POST,而我沒有在這裏進行AJAX調用,因此我不能依賴於PUT和DELETE。 – limc 2012-03-16 14:25:56
@limc,這是不是真的,柱可以修改(服務器端)到其他請求類型與'org.springframework.web.filter.HiddenHttpMethodFilter' – Ralph 2012-03-16 14:53:30