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
不支持该请求方法。但是为什么POST
不PUT
呢?幕后到底发生了什么?
问题答案:
所调用的“隐藏参数”的使用_method
并非特定于Spring MVC的标签库,而是由其他一些客户端框架使用。像这样,Spring只是遵循惯例。
为了正确使用此功能,您需要在web.xml
,(HiddenHttpMethodFilter
请参阅javadoc)中添加一个过滤器,该过滤器会将_method
参数转换为中的“真实”HTTP方法表示形式HttpServletRequest
。这是作为一个过滤器进行强调这样一个事实的缺乏PUT
和DELETE
它就好了servlet
API支持-是一个浏览器的问题。
因此,如果要在表单中使用这些方法,则需要添加该过滤器。
PS收到“不支持POST”消息的原因是表单使用POST
,并且处理程序带有注释PUT
,因此不匹配。因为没有定义过滤器,所以_method
将忽略该参数。