当前位置: 首页 > 面试题库 >

在Spring MVC中使用PUT和DELETE方法

公孙森
2023-03-14
问题内容

我正在尝试在Spring MVC控制器(版本3.0.2)中使用RequestMethod.PUTRequestMethod.DELETE。在Spring控制器类中,有三种与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>

PUT(and DELETE too)方法永远不会调用(没有异常或错误)。我在这里想念什么?

更新:

通过以下配置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类似所示的位置?(这是一个内置的类)


问题答案:

大多数浏览器不支持action=PUTHTML表单。他们只会发送POST请求。该HiddenHttpMethodFilter会帮助你解决问题,但你必须有一个隐藏字段_method=PUT在你的形式。如果使用spring:form标签库,这将自动为你完成,但是你的示例似乎使用纯HTML。

NoSuchBeanDefinitionException很可能是一个不相关的问题。



 类似资料:
  • 问题内容: 它应该是如此简单。我已经跟踪了所有可以找到的教程和论坛,但是无法正常工作。我只想在Apache2上用PHP构建RESTful API。 在我的VirtualHost指令中,我说: 但是我向服务器发出的每个PUT请求都得到了不支持的405方法。 有人提倡使用Script指令,但是由于我使用的是mod_php(而不是CGI),所以我不明白为什么会这样。 人们提到使用WebDAV,但在我看来

  • 唯一的GET方法一直在工作,但PUT、POST和DELETE总是出错。我尝试通过网络更新处理程序映射。也可以在IIS站点下进行配置。最初,我得到了错误的状态代码405作为方法不允许。当我将处理程序映射更改为 开始将415的错误设置为“不支持的媒体类型”。以下是我收到的回复 {StatusCode: 415, ReasonPhrase:'Unsupport Media Type', Version:

  • 问题内容: 我正在为CodeIgniter开发我的REST客户端库,并且正在努力研究如何在PHP中发送PUT和DELETE参数。 在一些地方,我看到人们在使用这些选项: 令人讨厌的是,这似乎无济于事。这是设置PUT参数的正确方法吗? 如果是这样,如何设置DELETE参数? $ this- > option()是我的库的一部分,它只是建立一个CURLOPT_XX常量数组,并在执行建立的cURL请求时

  • 问题内容: 我已经无法通过Fetch获得GET和POST方法了。但是我找不到任何很好的DELETE和PUT示例。 所以,我要你。您能否举一个使用fetch的DELETE和PUT方法的好例子。并解释一下。 问题答案: 这是一个获取示例。您可以针对进行相同操作。

  • 问题内容: 假设我的Web应用程序在服务器端完全支持PUT和DELETE,我应该使用它们吗? 基本上我的问题是有多少浏览器支持此功能: 要么 除了符合REST之外,使用这两种HTTP方法还有什么好处?(假设这两种方法的替代品是常用的POST) 问题答案: 您的问题涉及两个密切相关但又独立的标准,即HTTP和HTML。PUT和DELETE方法是HTTP的一部分。在HTTP中,它们在RESTful接口

  • 问题内容: 我正在使用WebAPI PUT和DELETE方法通过jQuery使用AJAX从我的网站执行操作。我的服务器是安装了Plesk的Windows Server2008 R2。POST和GET请求工作正常,但是PUT和DELETE失败。 最初将站点部署到服务器时,最初得到的是响应。然后我执行了一些操作,结果变成了。 现在,我正在接收内部服务器错误: 处理程序“ ExtensionlessUr