Thymeleaf Spring Chechbox List
Всем добрый день, имеется вот такая проблема:
Имеется вьюшка, где нужно поставить несколько галочек в ответах, далее эти ответы должны отправляться в Controller и уже обрабатываться. Не нашел прямого ответа как решить эту проблему.
Thymeleaf:
<div>
<table class="table table-hover" th:if="${question.getType() == 'multiple'}">
<form th:action="@{/quiz/question/answer/multiple}" method="post" class="form-horizontal">
<thead class="thead-dark">
<tr>
<th>ID</th>
<th>Variant</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr th:each="answer, itrStat : ${answers}">
<td th:text="${itrStat.index + 1}"/>
<td th:text="${answer.getTitle()}"/>
<td> <input type="checkbox" th:field="*{answerListForMultiplyAnswer[__${answer.getId()}__]}">
</td>
</tr>
</tbody>
<button type="submit" class="btn btn-primary">Confirm</button>
</form>
</table>
</div>
Далее у нас контроллер, который отправляет в на эту страницу:
@GetMapping("question/answer/{userChoiceQuestion}/{quizId}")
public String questionAnswer(Model model,
@PathVariable("userChoiceQuestion") Long userChoiceQuestion,
@PathVariable("quizId") Long quizId,
HttpSession session) {
Question question = questionService.getOneById(userChoiceQuestion);
List<Answer> answers = answerService.getAllAnswersByQuestionId(question.getId());
List<Long> answerListForMultiplyAnswer = new ArrayList<>();
model.addAttribute("answerListForMultiplyAnswer",answerListForMultiplyAnswer);
model.addAttribute("question",question);
model.addAttribute("quizId",quizId);
model.addAttribute("answers",answers);
return "question_answer";
А вот теперь метод, который должен все это дело принять (по факту только список из выбранных answerId):
@PostMapping("/question/answer/multiple")
public void multipleAnswerToQuestion(Model model,
@RequestParam("answerListForMultiplyAnswer") List<Long> multiplyAnswers) {
System.out.println(multiplyAnswers);
}
Суть вопроса:
как правильно засунуть в List answerListForMultiplyAnswer несколько AnswerId через CheckBox?
Как правильно отправить этот List в POST запрос.
Как правильно принять этот List в Controller?
Буду очень благодарен за помощь в вопросе.
Всем хорошего дня!
Ответы (1 шт):
К сожалению, никто не ответил, но я уже сам разобрался, вдруг кому-то будет полезно.
И так, чтобы принять несколько значений, мы убираем лишнее из Controller, который переводит на страницу с Thymeleaf:
@GetMapping("question/answer/{userChoiceQuestion}/{quizId}")
public String questionAnswer(Model model,
@PathVariable("userChoiceQuestion") Long userChoiceQuestion,
@PathVariable("quizId") Long quizId,
HttpSession session) {
Question question = questionService.getOneById(userChoiceQuestion);
List<Answer> answers = answerService.getAllAnswersByQuestionId(question.getId());
//тут был лишний List<Long> который я создавал, он не нужен (!)
model.addAttribute("question",question);
model.addAttribute("quizId",quizId);
model.addAttribute("answers",answers);
return "question_answer";
}
Далее в самой вьюшке добавляем всего-лишь вот такую строчку в :
<table class="table table-hover" th:if="${question.getType() == 'multiple'}">
<form th:action="@{/quiz/question/answer/multiple}" method="post" class="form-horizontal">
<thead class="thead-dark">
<tr>
<th>ID</th>
<th>Variant</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr th:each="answer, itrStat : ${answers}">
<td th:text="${itrStat.index + 1}"/>
<td th:text="${answer.getTitle()}"/>
<td><input type="checkbox" name="answerList" th:value="${answer.getId()}">
<input type="hidden" name="quizId" th:value="${quizId}">
<input type="hidden" name="questionId" th:value="${question.getId()}"> <!-- МЕНЯЕМ ТОЛЬКО ВОТ ТУТ-->
</td>
</tr>
</tbody>
<button type="submit" class="btn btn-primary">Confirm</button>
</form>
</table>
А сам контроллер, который будет получать данные будет выглядеть вот так:
@PostMapping("/question/answer/multiple")
public String multipleAnswerToQuestion(Model model,
@RequestParam("answerList") Long[] answerList,
@RequestParam("questionId") Long questionId,
@RequestParam("quizId") Long quizId,
HttpSession httpSession) {
for (Long answerId : answerList) {
outcomeMakerService.addToOutcomeMaker(httpSession,answerId,questionId,quizId);
}
OutcomeMaker outcomeMaker = outcomeMakerService.getCurrentMaker(httpSession);
model.addAttribute("outcomeMaker", outcomeMaker);
model.addAttribute("quizId",quizId);
return "success_answer";
}
Подведя итог: Чтобы получить множественные значения нам нужно сделать form с кнопкой отправки POST запроса, в самом input checkbox указать какое имя у нас будет передаваться, далее какое оно должно принимать значение, а со стороны Controller мы просто ловим [] тех данных, которые нам требуются.
Все достаточно легко!
Если помогло - апайте сообщение!
Всем хорошего дня!