Spring MVC可以处理来自POST和GET之外的HTML表单的请求吗?


问题内容

Spring 3
MVC支持所有RESTful方法的4种: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之外的其他方法。但是Spring可以input用名称_method和值来处理它METHOD_NAME。可以?

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

@RequestMapping(method=RequestMethod.PUT)

它声称 POST 不支持该请求方法。但是为什么POSTPUT呢?幕后到底发生了什么?


问题答案:

所调用的“隐藏参数”的使用_method并非特定于Spring MVC的标签库,而是由其他一些客户端框架使用。像这样,Spring只是遵循惯例。

为了正确使用此功能,您需要在web.xml,(HiddenHttpMethodFilter请参阅javadoc)中添加一个过滤器,该过滤器会将_method参数转换为中的“真实”HTTP方法表示形式HttpServletRequest。这是作为一个过滤器进行强调这样一个事实的缺乏PUTDELETE它就好了servlet
API支持-是一个浏览器的问题。

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

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