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

ffr*_*end 10 forms spring spring-mvc http-method

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

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

<form:form action="/myaction" method="PUT">
   ...
</form:form>
Run Code Online (Sandbox Code Playgroud)

生成的HTML是:

<form id="command" action="/myaction" method="post">
   <input type="hidden" name="_method" value="PUT"/>
   ...
</form>
Run Code Online (Sandbox Code Playgroud)

很明显,因为除了GET和POST之外,大多数浏览器都不支持其他方法.但Spring可以通过附加input名称_method和值来处理它METHOD_NAME.可以?

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

@RequestMapping(method=RequestMethod.PUT)
Run Code Online (Sandbox Code Playgroud)

它声称,POST不支持该请求方法.但为什么POSTPUT呢?在引擎盖下实际发生了什么?

ska*_*man 18

调用的"隐藏参数"的使用_method并不特定于Spring MVC的标记库,但也被其他一些客户端框架使用.Spring正遵循惯例,例如它.

为了正确使用它,你需要为你的web.xml(HiddenHttpMethodFilter,参见javadoc)添加一个过滤器,它将_method参数转换为一个"真正的"HTTP方法表示HttpServletRequest.这是作为一个过滤器来完成的,以强调浏览器缺少的问题,PUT并且DELETE是一个浏览器问题 - servlet API支持它就好了.

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

PS您获得"不支持POST"消息的原因是您的表单使用POST,并且您的处理程序已注释PUT,因此它不匹配.由于您没有定义过滤器,因此_method将忽略该参数.