我有一个简单的控制器,代码如下:
@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)将导致"No mapping found"异常。
我想在这里理解的是为什么映射3处理(/groups POST)和(/groups / 1 POST)?它应该在此处处理(/groups POST),因为请求映射与URI匹配。为什么(/groups / 1 POST)不会在这里引发“No mapping found”异常呢?实际上,似乎任何以/groups开头的POST URI(例如:/groups/bla/1 POST)也都将由映射#3处理。
有人能给我提供一个清晰的解释吗?非常感谢。
澄清:
我知道我可以使用更适当的方法(如GET、POST、PUT或DELETE)...或者我可以创建另一个请求映射来处理/groups/{id} POST。
然而,我真正想知道的是...
.... "为什么映射#3也处理/groups/1 POST?"
“最接近匹配”的推理似乎并不成立,因为如果我删除映射#2,那么我认为映射#1将处理/groups/1 GET,但它并没有,而是导致了"No mapping found"异常。
我只是有点困惑。
org.springframework.web.filter.HiddenHttpMethodFilter
可以将POSTs(在服务器端)修改为其他请求类型。 - Ralph_method
技巧。根据你的帖子,我现在正在查看Spring源代码。 - limc