Ho un semplice controller che assomiglia a questo: -Capire come di Spring MVC @RequestMapping Post Works
@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) {
...
}
}
In sostanza, questa pagina ha le seguenti funzionalità: -
- utente visita la pagina principale (
/groups GET
). - L'utente crea un nuovo gruppo (
/groups POST
) o seleziona un gruppo specifico (/groups/1 GET
). - L'utente modifica un gruppo esistente (
/groups/1 POST
).
Capisco come funzionano entrambi i mapping delle richieste GET. La mappatura n. 2 è definita, altrimenti (/groups/1 GET
) causerà un'eccezione "Nessuna associazione trovata".
Quello che sto cercando di capire qui è il motivo per la mappatura # 3 gestisce sia (/groups POST
) e (/groups/1 POST
)? Ha senso che dovrebbe gestire (/groups POST
) qui poiché il mapping della richiesta corrisponde all'URI. Perché (/groups/1 POST
) non sta generando un'eccezione "Nessuna associazione trovata" che viene lanciata qui? In effetti, sembra quasi che qualsiasi POST con URI che inizia con/gruppi (es: /groups/bla/1 POST
) venga gestito anche dalla mappatura # 3.
Qualcuno può fornirmi una spiegazione chiara? Grazie mille.
CHIARIMENTO
Capisco il fatto che posso usare metodi più appropriati (come GET, POST, PUT o DELETE) ... o io in grado di creare l'ennesimo mappatura richiesta per gestire /groups/{id} POST
.
Tuttavia, quello che voglio sapere davvero è ...
.... "Perché mappatura # 3 maniglia /groups/1 POST
anche tu?"
Il ragionamento "più vicino match" non sembrano tenere vero, perché se tolgo la mappatura # 2, quindi penserei mappatura # 1 si occuperà /groups/1 GET
, ma non è così e che provoca un "alcun mapping trovato " eccezione.
Sono solo un po 'perplesso qui.
Perché non utilizzare PUT per l'aggiornamento di una risorsa? Quello sarebbe il protocollo HTTP corretto. –
L'invio del modulo web supporta solo GET e POST, e non sto facendo call AJAX qui, quindi non posso contare su PUT e DELETE a questo punto. – limc
@limc, questo non è proprio vero, i POST possono essere modificati (sul lato server) in un altro tipo di richiesta con l'aiuto di 'org.springframework.web.filter.HiddenHttpMethodFilter' – Ralph