22

Spring MVC コントローラー (バージョン 3.0.2) で使用しようとしていますRequestMethod.PUTRequestMethod.DELETESpring コントローラー クラスには、次のように URL にマッピングされた 3 つのメソッドがあります (それぞれ PUT、GET、および POST であり、デモンストレーションのみを目的としています)。

@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は呼び出されません。


Springフォームには、送信ボタンと画像ブラウザのみが含まれています。

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

( PUTand DELETEtoo) メソッドが呼び出されることはありません (例外やエラーなし)。ここで何が欠けていますか?


アップデート :

で次の構成を使用すると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」という名前の Bean が定義されていません

namedispatcherはサーブレットの名前で、org.springframework.web.servlet.DispatcherServlet次のように web.xml に既にマップされています。

<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

ここに重要な点が記載されています。

4

2 に答える 2

18

action=PUTほとんどのブラウザはHTML フォームをサポートしていません。POST代わりにリクエストを送信するだけです。HiddenHttpMethodFilterは問題を回避するのに役立ちますが_method=PUT、フォームに隠しフィールドを含める必要があります。spring:form taglib を使用すると、これは自動的に行われますが、例ではプレーンな HTML を使用しているようです。

これNoSuchBeanDefinitionExceptionはおそらく無関係の問題です。

于 2012-11-30T19:37:10.953 に答える
1

構成を変更する必要があります。

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

<servlet-name>[dispatch servlet name]</servlet-name> 
于 2014-10-31T11:02:03.650 に答える