En utilisant les méthodes PUT et DELETE dans Spring MVC

Je suis en train d'utiliser RequestMethod.PUT et RequestMethod.DELETE dans Spring MVC contrôleur (version 3.0.2). Il existe trois méthodes de cartographie à l'aide d'une URL dans le Ressort de la classe contrôleur comme suit (PUT, GET et POST, respectivement, pour la démonstration seulement).

@RequestMapping(method = {RequestMethod.PUT}, value = {"admin_side/Temp"}, headers = {"content-type=multipart/form-data"})
public String update(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) {
if (ServletFileUpload.isMultipartContent(request)) {
System.out.println("true");
}
System.out.println("Request method PUT");
return "admin_side/Temp";
}
@RequestMapping(method = {RequestMethod.GET}, value = {"admin_side/Temp"})
public String showForm(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) {
System.out.println("Request method GET");
return "admin_side/Temp";
}
@RequestMapping(method = {RequestMethod.POST}, value = {"admin_side/Temp"})
public String onSubmit(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) {
System.out.println("Request method POST");
return "admin_side/Temp";
}

Lorsque la page est chargée, le GET méthode est invoquée comme une évidence, mais dans tous les autres cas (lorsque la page est envoyée), la seule méthode pour être appelé est POST, la méthode désigné avec RequestMethod.PUT n'est jamais invoquée.


Le Printemps formulaire contient seulement un bouton de soumission et d'une image navigateur,

<form:form id="mainForm"
name="mainForm"
method="PUT"
action="Temp.htm"
enctype="multipart/form-data"
commandName="tempBean">
<input type="file" id="myFile" name="myFile"/>
<input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/>
</form:form>

Le code HTML généré est comme suit,

<form id="mainForm"
name="mainForm"
action="Temp.htm"
method="post"
enctype="multipart/form-data">
<input type="hidden" name="_method" value="PUT"/>
<!--This hidden field is implicitly included-->
<input type="file" id="myFile" name="myFile"/>
<input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/>
</form>

Dans mon spring-config.xml (dispatcher-servlet.xml dans mon cas), j'ai ajouté une référence à CommonsMultipartResolver:

<bean id="filterMultipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

et dans mon web.xml fichier, HiddenHttpMethodFilter est configuré comme suit,

<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param>
<param-name>multipartResolverBeanName</param-name>
<param-value>filterMultipartResolver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>

La PUT (et DELETE trop) méthode n'est jamais invoquée (sans exception ou une erreur). Ce qui me manque ici?


Mise à jour :

Avec la configuration suivante dans web.xml,

<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param> <!-- Makes no difference, if excluded. -->
<param-name>multipartResolverBeanName</param-name>
<param-value>filterMultipartResolver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<servlet-name>dispatcher</servlet-name>  <!--Changed from /* to dispatcher-->
</filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>dispatcher</servlet-name> <!--Changed from /* to dispatcher-->
</filter-mapping>

il jette l'exception suivante.

org.springframework.les haricots.usine.NoSuchBeanDefinitionException: Aucun
bean nommé "filterMultipartResolver" est défini

Où le nom dispatcher est le nom de la Servlet - org.springframework.web.servlet.DispatcherServlet déjà mappé dans web.xml comme suit.

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

Je ne suis pas sûr de ce que d'autre n'est nécessaire? Est le filtre HiddenHttpMethodFilter nécessaires pour mettre en œuvre sur notre propre extension OncePerRequestFilter quelque chose de semblable à celui illustré ici? (c'est une classe intégrée)

Points importants sont répertoriés ici.

InformationsquelleAutor Tiny | 2012-11-29