Передайте экземпляр объекта в каждом l oop из файла thymeleaf html в контроллер Spring - PullRequest
1 голос
/ 15 января 2020

У меня проблема с передачей экземпляра "потоков" в каждом l oop из тимилиста в контроллер Spring с помощью кнопки отправки. Я пытаюсь решить эту проблему с помощью аннотации @ModelAttribute, но создается еще один экземпляр MessageThread.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org" xmlns:form="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>Форум</title>
</head>
    <body>

        <form method="post">
            <input type="text" name="header">
            <input type="text" name="text">
            <button name="newThread" type="submit">Создать тред</button>
        </form>

        <table>
            <thead>
            <tr>
                <th> Тред </th>
                <th> ОП пост </th>
            </tr>
            </thead>
            <tbody>
            <tr th:if="${threads.isEmpty()}">
                <td colspan="2"> Нет доступных тредов </td>
            </tr>
            <div>
                <th:block th:each="thread : ${threads}">
                    <td th:type="id"><span th:text="${thread.getId()}"></span></td>
                    <td><span th:text="${thread.getHeader()}"> Title </span></td>
                    <td><span th:text="${thread.getText()}"> Title </span></td>
                    <form th:object="${thread}" th:method="post">
                        <td><button name="inThread" type="submit">В тред</button></td>
                    </form>
                </th:block>
            </div>
            </tbody>
        </table>

    </body>
</html>

Я не могу найти способ передать экземпляр "потоков" из тимелиста. Все, что я хочу - это нажать кнопку «Отправить» и передать метод $ {thread} методу «toThread».

Мой контроллер:

@Controller
public class ThreadController {

private final MessageService messageService;

@Autowired
public ThreadController(MessageService messageService) {
    this.messageService = messageService;
}

@GetMapping("/")
public String showThreads(Model model)
{
    model.addAttribute("threads", messageService.getThreads());
    return "threads-view";
}

@PostMapping(value = "/", params = "newThread")
public String addThread(Model model,
                        @RequestParam("header") String header,
                        @RequestParam("text") String text)
{
    model.addAttribute("threads", messageService.getThreads());
    messageService.addThread(header, text);
    return "redirect:/";
}

@PostMapping(value = "/", params = "inThread")
public String toThread(@ModelAttribute("thread") MessageThread thread) {
    System.out.println(thread.getId() + " " + thread.getHeader());
    return "redirect:/thread:";
}

}

Класс MessageThread:

package com.project.imageboard.model;

 import java.util.ArrayList;
 import java.util.List;

 public class MessageThread {

private String header;
private String text;
private int id;

private List<Message> messages = new ArrayList<>();

public MessageThread(String header, String text) {
    this.header = header;
    messages.add(new Message(text));
    this.text = text;
    this.id = messages.get(0).getId();
}

public int getId() {
    return id;
}
public String getText() {
    return text;
}
public String getHeader() {
    return header;
}

public List<Message> getMessages() {
    return messages;
}

public void insertMessage(Message message){
    messages.add(message);
}

}

Буду признателен за любую помощь.

1 Ответ

1 голос
/ 15 января 2020

с вашим контроллером все в порядке, вы отображаете запрос post на "/" и ожидаете получить объект MessageThread, который должен быть построен из содержимого запроса, проблема в шаблоне: вы не отправляете данные в запросе от клиента к серверу, поэтому у Spring нет способа присвоить правильные значения новому экземпляру MessageThread.

Если мы возьмем этот блок из вашего шаблона:

<th:block th:each="thread : ${threads}">
    <td th:type="id"><span th:text="${thread.getId()}"></span></td>
    <td><span th:text="${thread.getHeader()}"> Title </span></td>
    <td><span th:text="${thread.getText()}"> Title </span></td>
    <form th:object="${thread}" th:method="post">
        <td><button name="inThread" type="submit">В тред</button></td>
    </form>
</th:block>

1) В теге формы отсутствует атрибут action, попробуйте добавить что-то вроде th:action="@{/}" для нацеливания сопоставления вашего запроса на стороне сервера.

2) Вы не отправляете фактическое содержимое объекта потока на сервер, для этого вы должны добавить входные теги с именем импута, совпадающим с именем поля в объекте MessageThread, который вы хотите заполнить. Примерно так:

<input type="hidden" th:field="*{header}" />
<input type="hidden" th:field="*{text}" />

В этом примере th:field создает атрибуты name и value для входных тегов, поэтому вам не нужно делать это вручную.

Подводя итог, невозможно передать фактический "экземпляр" объекта из html, запущенного на клиенте, в приложение java, запущенное на сервере, вы можете отправлять данные только по HTTP и анализировать, что данные на сервере. Аннотация ModelAttribute инструктирует Spring проверять объект (в данном случае MessageThread) и находить в данных, отправляемых через запрос, соответствующие значения для заполнения объекта.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...