我正在尝试通过删除链接(a 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)
请注意,虽然RequestMapping注解使用了RequestMethod.POST,但由于Map值明确指定了/id/delete
,因此它不使用默认的POST映射到/invoices
和/invoices/id
。
我希望我的表述清楚。如果有任何建议或示例代码(强烈推荐),我将非常感激。我已经阅读了以下参考资料链接: 链接1 链接2 链接3