2010-12-06 7 views
9

Spring 3 MVC admite los 4 métodos RESTful: GET, POST, PUT y DELETE. Pero, ¿su tecnología de visualización los respalda en formularios? Si no, ¿cuál es el uso real del atributo method en la etiqueta form:form?¿Puede Spring MVC manejar las solicitudes de formularios HTML que no sean POST y GET?

He intentado utilizar el método PUT en el formulario:

<form:form action="/myaction" method="PUT"> 
    ... 
</form:form> 

HTML generado fue:

<form id="command" action="/myaction" method="post"> 
    <input type="hidden" name="_method" value="PUT"/> 
    ... 
</form> 

Está claro desde most browsers don't support other methods besides GET and POST. Pero Spring puede manejarlo con input adicional con el nombre _method y el valor METHOD_NAME. ¿Lo hace?

Cuando envío de formulario especificados a un método controlador anotado con

@RequestMapping(method=RequestMethod.PUT) 

afirma, que el método de solicitud POST no es compatible. Pero ¿por qué POST y no PUT? ¿Qué sucede realmente debajo de las capuchas?

Respuesta

16

El uso del "parámetro oculto" llamado _method no es específico de la biblioteca de etiquetas de Spring MVC, sino que también es utilizado por algunos otros marcos cliente. Spring está siguiendo la convención, tal como es.

Para utilizar esto correctamente, es necesario agregar filtros a su web.xml, (HiddenHttpMethodFilter, ver javadoc), lo que convierte el parámetro _method en una representación método HTTP "real" en el HttpServletRequest. Esto se hace como un filtro para enfatizar el hecho de que la falta de PUT y DELETE es un problema del navegador: la API de servlet lo admite perfectamente.

Así que si desea utilizar estos métodos en su formulario, debe agregar ese filtro.

P.S. El motivo por el que aparece el mensaje "POST no admitido" es que su formulario usa POST, y su controlador está anotado con PUT, por lo que no coincide. Como no tiene definido el filtro, se ignora el parámetro _method.

Cuestiones relacionadas