#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}’