【问题标题】:programming Spring MVC controller and jsp for HttpDelete为 HttpDelete 编程 Spring MVC 控制器和 jsp
【发布时间】:2011-10-26 13:48:21
【问题描述】:

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

注意,RequestMethod.POST,但由于映射值明确具有/id/delete,它不使用映射到/invoices/invoices/id 的默认POST。

我希望我很清楚。如果有人有任何建议或示例代码(强烈推荐),我将不胜感激。我已阅读这些 SO 链接以供参考: Link1 Link2 Link3

【问题讨论】:

  • 我面临同样的问题。我也添加了过滤器。但是删除方法仍然转换为 POST。你能帮忙吗

标签: java spring jsp rest spring-mvc


【解决方案1】:

您是否在 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。你能帮忙吗
【解决方案2】:

这是 Java Config 中的等价物(需要 Servlet API 3.0+)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2018-01-18
    • 2013-05-31
    • 2011-06-23
    • 2021-04-03
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多