gpt4 book ai didi

spring - 在 Spring MVC 中使用 PUT 和 DELETE 方法

转载 作者:IT老高 更新时间:2023-10-28 13:48:50 24 4
gpt4 key购买 nike

我正在尝试在 Spring MVC Controller (版本 3.0.2)中使用 RequestMethod.PUTRequestMethod.DELETE。 Spring Controller 类中有如下三种方法映射到一个 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.xml(在我的例子中为 dispatcher-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: No bean named 'filterMultipartResolver' is defined

其中 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 上实现类似于显示的 here ? (它是一个内置类)

列出了重要点here .

最佳答案

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

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

关于spring - 在 Spring MVC 中使用 PUT 和 DELETE 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13629653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com