2012-11-29 23 views
18

私はRequestMethod.PUTRequestMethod.DELETEをSpring MVCコントローラ(バージョン3.0.2)で使用しようとしています。 SpringコントローラクラスのURLには、次のように3つのメソッドがマッピングされています(デモンストレーション目的の場合のみ、それぞれ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は、私の場合は私のspring-config.xmldispatcher-servlet.xml

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

、あります)、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> 

(すぎとDELETEPUT方法は、(例外またはエラーなしで)呼び出されることはありません。私はここで何が欠けていますか?


更新: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: - org.springframework.web.servlet.DispatcherServletすでにweb.xmlにマッピングされた 'filterMultipartResolver' という名前はありません Beanは名前dispatcherは、サーブレットの名前です

を定義しています次のように。

<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 **に自動的に含まれます(質問の2番目と3番目のコードスニペットに示されています)。私はすでにこのサイトの他のチュートリアルと同様に多くの投稿を見てきました。私の場合は、問題は機能しませんが、私は彼らの説明どおりにやっています。私は何が欠けているのか分からない。答えをありがとう。 – Tiny

+0

申し訳ありませんが、あなたの投稿を間違えました...私の悪いです。 – Guillaume

+0

あなたのテキストは、 "* NoSuchBeanDefinitionExceptionはおそらく無関係な問題です*"が正しいです。唯一の問題は、この 'org.springframework.web.multipart.commons.CommonsMultipartResolver'を誤って構成し、' applicationContext.xml'に配置するのではなく、間違ったXMLファイルに配置したことでした。したがって、例外が発生していました。これで動作し、Springコントローラで 'RequestMethod.PUT'で指定されたメソッドが呼び出されます。それでも 'ServletFileUpload.isMultipartContent(request)'が常にfalseを返すという問題が残っています。これは 'POST'でのみtrueを返します。理由を知っていますか? – Tiny

1

設定を変更する必要があります。 = "_方式" 値= "PUT` ... `と隠しフィールド`の

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

<servlet-name>[dispatch servlet name]</servlet-name> 
関連する問題