программирование Spring MVC контроллера и JSP для HttpDelete - PullRequest
6 голосов
/ 26 октября 2011

Я пытаюсь удалить объект на странице с помощью ссылки удаления (ссылка) или кнопки удаления (форма).Я использую кнопку удаления, так как ссылка вызывает «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 для создания счета-фактуры, и, нажав кнопку удаления, вместо этого создал счет-фактуру.Я предполагаю, что контроллер смотрит на сервлет как 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, он не использует POST по умолчанию, который сопоставлен с /invoices и /invoices/id.

Надеюсь, у меня все ясно.Если у кого-то есть какие-либо предложения или пример кода (настоятельно рекомендуется), я был бы признателен.Я прочитал эти ссылки SO для ссылок: Link1 Link2 Link3

Ответы [ 2 ]

7 голосов
/ 26 октября 2011

Вы установили HiddenHttpMethodFilter в своем файле web.xml? Этот фильтр преобразует опубликованные параметры метода в методы 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>
2 голосов
/ 13 ноября 2014

Вот эквивалент в Java Config (требуется Servlet API 3.0 +)

    servletContext
        .addFilter("HiddenHttpMethodFilter", HiddenHttpMethodFilter.class)
        .addMappingForUrlPatterns(null, false, "<your desired mapping here>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...