10

Spring 3 MVC 支持所有 4 种 RESTful 方法:GET、POST、PUT 和 DELETE。但它的视图技术是否支持它们在表单上?如果不是,标签中method属性的真正用途是什么?form:form

我尝试在表单上使用 PUT 方法:

<form:form action="/myaction" method="PUT">
   ...
</form:form>

生成的 HTML 是:

<form id="command" action="/myaction" method="post">
   <input type="hidden" name="_method" value="PUT"/>
   ...
</form>

很明显,因为大多数浏览器不支持除 GET 和 POST 之外的其他方法input但是 Spring 可以使用 name_method和 value来处理它METHOD_NAME。可以?

当我将指定的表单发送到带有注释的控制器方法时

@RequestMapping(method=RequestMethod.PUT)

它声称,POST不支持该请求方法。但为什么POSTPUT呢?引擎盖下到底发生了什么?

4

1 回答 1

18

调用的“隐藏参数”的使用_method并不特定于 Spring MVC 的标签库,但也被其他一些客户端框架使用。Spring 只是遵循惯例,就像它一样。

为了正确使用它,您需要在您的web.xml, ( HiddenHttpMethodFilter,请参阅javadoc ) 中添加一个过滤器,它将_method参数转换为HttpServletRequest. 这是作为过滤器完成的,以强调缺少PUT并且DELETE是浏览器问题的事实 - servlet API 很好地支持它。

因此,如果您想在表单中使用这些方法,则需要添加该过滤器。

PS您收到“不支持POST”消息的原因是您的表单使用了POST,并且您的处理程序带有注释PUT,因此它不匹配。因为您没有定义过滤器,所以该_method参数被忽略。

于 2010-12-06T08:21:42.117 回答