Создание POST-запроса из JSP без полей ввода для нескольких разных действий

#java #spring #jsp #model-view-controller

#java #весна #jsp #модель-представление-контроллер

Вопрос:

У меня есть объект — событие. Существует JSP-карта события. Я хочу, чтобы на карточке была кнопка для удаления события, поэтому мне нужно создать POST-запрос на сервер для него, но я не знаю, как это сделать.

Я попытался: передать в представление специальный логический false ModelAttribute «wasDeleted», изменить его при нажатии кнопки с помощью скрипта и передать модель методу PostMapping в контроллере. Есть части кода:

Передача специального атрибута модели:

     @GetMapping("/event{Id}")
    public String getCurrentEvent(@PathVariable String Id, Model model) {
        //...
        if (user.getEvents().contains(event)) {
            model.addAttribute("wasDeleted", false);
            return "myEvent";
        }
        //...


  

JSP-представление карточки событий:

 <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>

<!DOCTYPE html>
<html lang="en">
  <head>
      <meta charset="utf-8">
      <title>Event card</title>

      <link href="${contextPath}/resources/css/bootstrap.min.css" rel="stylesheet">
      <link href="${contextPath}/resources/css/common.css" rel="stylesheet">
  </head>

  <body>

<form:form method="POST" modelAttribute="wasDeleted" class="form-signin">

          <script>
              function delete(){
                  wasDeleted = true;
                     }
          </script>

          <button class="btn btn-lg btn-primary btn-block" type="submit" onClick='delete()'>Delete event</button>
      </form:form>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="${contextPath}/resources/js/bootstrap.min.js"></script>
  </body>
</html>

  

Метод удаления в методе контроллера:

     @PostMapping("/event{Id}")
    public String changeEvent(@PathVariable String Id, Model model) { //I don't use @ModelAttribute here because Model can have another attributes (the set of attributes may be different depends of event)
        //...

        if (user.getEvents().contains(event)) {
            boolean wasDeleted = (boolean)model.getAttribute("wasDeleted");
            if (wasDeleted) {
                user.getEvents().remove(event);
                eventRepository.delete(event);
            }
            //...
        }
    //...

  

Ошибка: модель пуста и не содержит атрибута «wasDeleted»

Помогите, пожалуйста, почему модель пуста? Как я могу изменить атрибут модели в JSP и передать его контроллеру? Может быть, есть другие способы передать на сервер информацию о том, что кнопка удаления была нажата?

Удаление — это пример действий с событием. На карте могут быть другие кнопки действий, поэтому было бы здорово иметь общее решение проблемы, позволяющее по-разному реагировать на разные кнопки контроллера

Комментарии:

1. в jsp form не хватает action attr . вы должны установить его в свой post-mapping ‘/ event{Id}’