我试图通过删除链接(href)或删除按钮(表单)删除页面上的实体。我正在使用删除按钮,因为链接需要“GET”而不是“POST”
这是打算这样做的JSP代码:
<td><form:form method="DELETE" action="/client/invoices/${invoice.id}"><input type="submit" value="delete"></form:form></td>
生成的html是这样的:
<td><form id="command" action="/client/invoices/9" method="post"><input type="hidden" name="_method" value="DELETE"/><input type="submit" value="delete"></form></td>
所以,我很高兴。它有_method表示它是DELETE操作。这是我的控制器代码:
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") Long id, @RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, Model uiModel) {
invoiceServiceHibernate.removeInvoice(id);
return "redirect:/invoices";
}
所以,会发生什么是没有调用此方法。我有另一种方法,它执行POST来创建发票并单击删除按钮而不是创建发票。我的猜测是控制器将servlet视为POST请求,并使用第一种处理POST请求的方法,在这种情况下是创建新发票。
我尝试将其设为“RESTful”,因此我希望它为/invoice/id
并使用POST, PUT, DELETE, GET
,但我不确定如何使用Spring MVC在控制器中对其进行编码。
我可以通过添加/invoices/id/delete
之类的“动词”并将控制器设置为
@RequestMapping(value = "/{id}/delete", method = RequestMethod.POST)
请注意,RequestMethod.POST但由于地图值明确具有/id/delete
,因此它不使用映射到/invoices
和/invoices/id
的默认POST。
我希望我很清楚。如果有人有任何建议或示例代码(强烈优先),我将不胜感激。我已阅读这些SO链接以供参考: Link1 Link2 Link3
答案 0 :(得分:7)
您是否在web.xml中设置了HiddenHttpMethodFilter?该过滤器将发布的方法参数转换为HTTP方法,并允许在Spring MVC表单标记中支持方法转换。
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<servlet-name>servletName</servlet-name>
</filter-mapping>
答案 1 :(得分:2)
这是Java Config中的等价物(需要Servlet API 3.0 +)
servletContext
.addFilter("HiddenHttpMethodFilter", HiddenHttpMethodFilter.class)
.addMappingForUrlPatterns(null, false, "<your desired mapping here>");