2010-12-06 45 views
9

Spring 3 MVC支持所有4种RESTful方法:GET,POST,PUT和DELETE。但它的视图技术是否以形式支持它们?如果不是,form:form标记中method属性的真实用途是什么?Spring MVC可以处理除POST和GET以外的其他HTML表单的请求吗?

我试图在窗体上使用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> 

这是自most browsers don't support other methods besides GET and POST清楚。但Spring可以使用额外的input来处理它,其名称为_method,值为METHOD_NAME。可以?

当我发送指定的形式与

@RequestMapping(method=RequestMethod.PUT) 

它声称注解的控制器的方法,该请求方法POST不被支持。但为什么POST而不是PUT?引擎盖下实际发生了什么?

回答

16

使用名为_method的“隐藏参数”不是特定于Spring MVC的标记库,但也被其他一些客户端框架使用。春天只是遵循这个惯例,就像那样。

为了正确地使用它,你需要一个过滤器添加到您的web.xml,(HiddenHttpMethodFilter,见javadoc),从而关_method参数到在HttpServletRequest一个“真实”的HTTP方法表示。这是作为过滤器来强调的,缺少PUTDELETE是一个浏览器问题 - servlet API支持它就好了。

所以如果你想在你的表单中使用这些方法,你需要添加该过滤器。

P.S.您收到“POST不支持”消息的原因是您的表单使用了POST,并且您的处理程序使用PUT进行了注释,因此它不匹配。由于您没有定义过滤器,因此将忽略_method参数。