que tiene un controlador simple que se parece a esto: -comprensión de cómo funciona @RequestMapping POST del Spring MVC
@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) {
...
}
}
Básicamente, esta página tiene las siguientes funcionalidades: -
- usuario visita la página principal (
/groups GET
). - El usuario crea un nuevo grupo (
/groups POST
) o selecciona un grupo específico (/groups/1 GET
). - El usuario edita un grupo existente (
/groups/1 POST
).
Entiendo cómo funcionan las dos asignaciones de solicitudes GET aquí. Se define el mapeo n. ° 2, de lo contrario (/groups/1 GET
) se producirá la excepción "No se encontró el mapeo".
Lo que trato de entender aquí es ¿por qué el mapeo # 3 maneja tanto (/groups POST
) como (/groups/1 POST
)? Tiene sentido que se controle aquí (/groups POST
) ya que la asignación de solicitudes coincide con el URI. ¿Por qué (/groups/1 POST
) no se está produciendo una excepción de "No se encontró el mapeo" aquí? De hecho, casi parece que cualquier POST con URI que comience con/groups (por ejemplo, /groups/bla/1 POST
) también se manejará mediante el mapeo # 3.
¿Alguien me puede dar una explicación clara de esto? Muchas gracias.
CLARIFICACION
entiendo el hecho de que puedo utilizar métodos más apropiados (como GET, POST, PUT o DELETE) ... o puede crear una nueva asignación de solicitud de manejar /groups/{id} POST
.
Sin embargo, lo que realmente quiero saber es ...
.... "¿Por qué la asignación # 3 mango /groups/1 POST
también?"
El razonamiento de "coincidencia más cercana" no parece ser cierto porque si elimino el mapeo n. ° 2, entonces pensaría que el mapeo n. ° 1 manejará /groups/1 GET
, pero no lo hace y causa un error. "excepción"
Estoy un poco perplejo aquí.
¿Por qué no utilizar PUT para la actualización de un recurso? Ese sería el protocolo HTTP adecuado. –
El envío del formulario web solo admite GET y POST, y no estoy haciendo una llamada AJAX aquí, así que no puedo confiar en PUT y DELETE en este punto. – limc
@limc, eso no es realmente cierto, los POST se pueden modificar (en el lado del servidor) a otro tipo de Solicitud con la ayuda de 'org.springframework.web.filter.HiddenHttpMethodFilter' – Ralph