在Spring MVC中使用PUT和DELETE方法
我试图在Spring MVC控制器(版本3.0.2)中使用RequestMethod.PUT
和RequestMethod.DELETE
。有三种方法在Spring控制器类中用URL映射如下(分别为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如下,
<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:没有 豆名为 'filterMultipartResolver' 被定义
当姓名dispatcher
是Servlet的名字 - 在web.xml中已映射org.springframework.web.servlet.DispatcherServlet
如下。
<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
很可能是一个无关的问题。
你应该改变你的配置。
<servlet-name>/*</servlet-name>
到
<servlet-name>[dispatch servlet name]</servlet-name>
我使用的标签库 - '
'和隐藏字段''会自动包含在**生成的HTML **中,如问题的第二个和第三个代码片段所示。我已经在这个网站上看到很多帖子以及其他教程。我差不多按照他们所描述的那样做,尽管这件事不起作用,就我而言。我不确定我错过了什么。感谢你的回答。 – Tiny对不起,我误解了你的帖子......我的不好。 – Guillaume
您的文本,“* NoSuchBeanDefinitionException很可能是一个无关的问题*”是正确的。唯一的问题是我错误地配置了这个'org.springframework.web.multipart.commons.CommonsMultipartResolver'并放置在一个错误的xml文件中,而不是放在'applicationContext.xml'中。因此,这是例外。它现在可以工作,并且在Spring控制器中用'RequestMethod.PUT'指定的方法被调用。一个问题仍然是'ServletFileUpload.isMultipartContent(request)'总是返回false。它只在'POST'上返回true。你知道原因吗? – Tiny