У меня есть простой контроллер, который выглядит следующим образом: -Понимание того, как работает 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
)? Имеет смысл, что он должен обрабатывать (/groups POST
) здесь, поскольку сопоставление запросов соответствует URI. Почему (/groups/1 POST
) не вызывает исключение «Нет сопоставления найденных» здесь? На самом деле, почти похоже, что любой POST с URI, начинающийся с/groups (например: /groups/bla/1 POST
), также будет обрабатываться путем сопоставления # 3.
Может кто-нибудь дать мне это ясное объяснение? Большое спасибо.
РАЗЪЯСНЕНИЕ
Я понимаю, тот факт, что я могу использовать более подходящие методы (например, GET, POST, PUT или DELETE) ... или я могу создать еще одно отображение запроса для обработки /groups/{id} POST
.
Однако то, что я хочу, чтобы действительно знать ...
.... "Почему отображение # 3 ручки /groups/1 POST
тоже?"
«Ближайшие совпадения» рассуждения кажутся недействительными, потому что если я удалю сопоставление # 2, то я думаю, что отображение # 1 будет обрабатывать /groups/1 GET
, но это не так, и оно вызывает «Нет сопоставления найдено исключение.
Я просто немного здесь.
Почему бы не использовать PUT для обновления ресурса? Это был бы правильный протокол HTTP. –
Представление в виде веб-формы поддерживает только GET и POST, и я не звоню AJAX здесь, поэтому я не могу полагаться на PUT и DELETE на этом этапе. – limc
@limc, на самом деле это не так, POST могут быть изменены (на стороне сервера) на другой тип запроса с помощью 'org.springframework.web.filter.HiddenHttpMethodFilter' – Ralph