Pasar una instancia de un objeto en cada bucle de thymeleaf archivo HTML al controlador de primavera

Himitsu:

Tengo un problema con el paso de una instancia de "hilos" en cada bucle de thymeleaf al controlador del resorte utilizando un botón de envío. Estoy tratando de resolver esto mediante el uso de la @ModelAttribute anotación, pero un ejemplo más de MessageThread está creando.

<!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>

No puedo encontrar una manera de pasar una instancia de "hilos" de thymeleaf. Todo lo que quiero es presionar el botón Enviar y pasar el hilo $ {} con el método "toThread".

Mi controlador:

@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 clase:

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);
}

}

Apreciaría cualquier ayuda.

Daniel Camarda:

su controlador parece estar bien, va a asignar una solicitud posterior a "/" y esperando recibir un objeto MessageThread que tiene que ser construido a partir del contenido de la solicitud, el problema está en la plantilla: usted no está enviando los datos en la solicitud desde el cliente al servidor, por lo que la primavera no tiene manera de asignar los valores correctos para una nueva instancia de MessageThread.

Si tomamos este bloque de la plantilla:

<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) La etiqueta de formulario no se encuentra el atributo de acción, trate de añadir algo así como th:action="@{/}"para orientar su asignación solicitud en el lado del servidor.

2) Usted no está enviando el contenido real del objeto hilo al servidor, para esto hay que añadir tags de entrada con el nombre de la llave de entrada coincida con el nombre del campo en el objeto MessageThread desea rellenar. Algo parecido a lo siguiente:

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

En este ejemplo th:fieldse crea el namey valueatributos de las etiquetas de entrada de modo que no es necesario hacerlo manualmente.

En resumen, no hay manera de pasar una "instancia" real de un objeto desde el html se ejecuta en el cliente para la aplicación Java que se ejecuta en el servidor, sólo puede enviar datos a través de HTTP y de análisis de los datos en el servidor. La ModelAttributeanotación está instruyendo a la primavera para inspeccionar un objeto ( MessageThreaden este caso) y encontrar en los datos enviados a través de la solicitud de los valores coincidentes para rellenar el objeto.

Espero que esto ayude.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=364194&siteId=1
Recomendado
Clasificación