为 HttpDelete 编写 Spring MVC 控制器和 JSP 程序设计。

6

我正在尝试通过删除链接(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/idPOST、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


我遇到了同样的问题。我已经添加了过滤器,但删除方法仍然被转换为POST。你能帮忙吗? - shalu
2个回答

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>

我遇到了同样的问题。我已经添加了过滤器,但是删除方法仍然转换为POST。你能帮忙吗? - shalu

2

以下是Java Config中的等效写法(需要Servlet API 3.0+)

    servletContext
        .addFilter("HiddenHttpMethodFilter", HiddenHttpMethodFilter.class)
        .addMappingForUrlPatterns(null, false, "<your desired mapping here>");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接