了解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同时处理()和()?它应该在这里处理()是有道理的,因为请求映射与URI匹配。为什么 () 不会导致此处引发“未找到映射”异常?事实上,似乎任何以 /groups 开头的 URI 的 POST(例如:)也将通过映射 #3 进行处理。/groups POST
/groups/1 POST
/groups POST
/groups/1 POST
/groups/bla/1 POST
有人可以向我提供明确的解释吗?非常感谢。
澄清
我理解我可以使用更合适的方法(如GET,POST,PUT或DELETE)的事实......或者我可以创建另一个请求映射来处理./groups/{id} POST
但是,我真正想知道的是...
....“为什么映射 #3 也处理 /groups/1 POST
?”
“最接近匹配”的推理似乎并不成立,因为如果我删除映射#2,那么我认为映射#1会处理,但它不会,它会导致“找不到映射”异常。/groups/1 GET
我只是有点难受。