2010-12-06 20 views
9

Spring 3 MVC prend en charge les 4 méthodes RESTful: GET, POST, PUT et DELETE. Mais sa technologie de vue les supporte-t-elle sur des formulaires? Si non, quelle est l'utilisation réelle de l'attribut method dans la balise form:form?Can Spring MVC gère-t-il les demandes provenant de formulaires HTML autres que POST et GET?

J'ai essayé d'utiliser la méthode PUT sur la forme:

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

HTML généré est:

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

Il est clair depuis most browsers don't support other methods besides GET and POST. Mais Spring peut gérer avec input supplémentaire avec le nom _method et la valeur METHOD_NAME. Le fait?

Lorsque j'envoyer forme spécifiée à un procédé de commande annotée avec

@RequestMapping(method=RequestMethod.PUT) 

selon elle, que la méthode de requête POST est pas supporté. Mais pourquoi POST et pas PUT? Qu'est-ce qui se passe réellement sous les hottes?

Répondre

16

L'utilisation du "paramètre caché" appelé _method n'est pas spécifique à la bibliothèque de balises de Spring MVC, mais est également utilisée par quelques autres frameworks clients. Le printemps suit juste la convention telle qu'elle est.

Pour utiliser correctement, vous devez ajouter un filtre à votre web.xml, (HiddenHttpMethodFilter, voir javadoc), qui transforme le paramètre _method en une représentation de méthode HTTP « réelle » dans le HttpServletRequest. Ceci est fait comme un filtre pour souligner le fait que l'absence de PUT et DELETE est un problème de navigateur - l'API servlet le supporte très bien. Par conséquent, si vous souhaitez utiliser ces méthodes dans votre formulaire, vous devez ajouter ce filtre.

P.S. La raison pour laquelle vous obtenez le message "POST non pris en charge" est que votre formulaire utilise POST et que votre gestionnaire est annoté avec PUT, il ne correspond donc pas. Parce que vous n'avez pas le filtre défini, le paramètre _method est ignoré.