2012-11-29 24 views
18

我試圖在Spring MVC控制器(版本3.0.2)中使用RequestMethod.PUTRequestMethod.DELETE。有三種方法在Spring控制器類中用URL映射如下(分別爲PUT,GET和POST,僅用於演示目的)。在Spring MVC中使用PUT和DELETE方法

@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"; 
} 

當頁面加載時,將GET方法被調用爲明顯,但在其他情況下(當頁面被提交),要調用的唯一方法是POST,與RequestMethod.PUT指定的方法是永遠調用。


春季形式僅包含一個提交按鈕和圖像瀏覽器,

<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> 

生成的HTML如下,

<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> 

以我spring-config.xmldispatcher-servlet.xml在我的情況),我添加了對CommonsMultipartResolver的引用:

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

,在我web.xml文件,HiddenHttpMethodFilter配置如下,

<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> 

PUT(和DELETE太)方法永遠不會調用(沒有異常或錯誤)。我在這裏錯過了什麼?


更新:

隨着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> 

它拋出以下異常。

org.springframework.beans.factory.NoSuchBeanDefinitionException:沒有 豆名爲 'filterMultipartResolver' 被定義

當姓名dispatcher是Servlet的名字 - 在web.xml中已映射org.springframework.web.servlet.DispatcherServlet如下。

<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> 

我不確定還需要什麼?是否需要過濾器HiddenHttpMethodFilter來實現我們自己的擴展OncePerRequestFilter類似於here所示的東西? (這是一個內置的類)

重要的點列出here

回答

13

大多數瀏覽器不支持HTML格式的action=PUT。他們只會發送POST請求。 HiddenHttpMethodFilter將幫助您解決問題,但您必須在表單中包含隱藏字段_method=PUT。如果您使用spring:form taglib,這將自動爲您完成,但您的示例似乎使用純HTML。

NoSuchBeanDefinitionException很可能是一個無關的問題。

+1

我使用的標籤庫 - ' ...'和隱藏字段''會自動包含在**生成的HTML **中,如問題的第二個和第三個代碼片段所示。我已經在這個網站上看到很多帖子以及其他教程。我差不多按照他們所描述的那樣做,儘管這件事不起作用,就我而言。我不確定我錯過了什麼。感謝你的回答。 – Tiny

+0

對不起,我誤解了你的帖子......我的不好。 – Guillaume

+0

您的文本,「* NoSuchBeanDefinitionException很可能是一個無關的問題*」是正確的。唯一的問題是我錯誤地配置了這個'org.springframework.web.multipart.commons.CommonsMultipartResolver'並放置在一個錯誤的xml文件中,而不是放在'applicationContext.xml'中。因此,這是例外。它現在可以工作,並且在Spring控制器中用'RequestMethod.PUT'指定的方法被調用。一個問題仍然是'ServletFileUpload.isMultipartContent(request)'總是返回false。它只在'POST'上返回true。你知道原因嗎? – Tiny

1

你應該改變你的配置。

<servlet-name>/*</servlet-name> 

<servlet-name>[dispatch servlet name]</servlet-name> 
相關問題