22

我正在尝试在 Spring MVC 控制器(版本 3.0.2)中使用RequestMethod.PUT和。RequestMethod.DELETESpring 控制器类中有如下三种方法映射到一个 URL (分别为 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

其中名称dispatcher是 Servlet 的名称 -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=PUTHTML 表单。他们只会发送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 回答