Java 将每个循环中的对象实例从thymeleaf html文件传递到Spring控制器

Java 将每个循环中的对象实例从thymeleaf html文件传递到Spring控制器,java,spring,thymeleaf,Java,Spring,Thymeleaf,我有一个问题,就是使用提交按钮将每个循环中的“线程”实例从thymeleaf传递到Spring控制器。我试图通过使用注解@modeldattribute来解决这个问题,但是又创建了一个MessageThread实例 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:form="http://www.w3.org/19

我有一个问题,就是使用提交按钮将每个循环中的“线程”实例从thymeleaf传递到Spring控制器。我试图通过使用注解@modeldattribute来解决这个问题,但是又创建了一个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>

}

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);
}
package com.project.imageboard.model;
导入java.util.ArrayList;
导入java.util.List;
公共类消息线程{
私有字符串头;
私有字符串文本;
私有int-id;
私有列表消息=新的ArrayList();
公共消息线程(字符串头、字符串文本){
this.header=头;
消息。添加(新消息(文本));
this.text=文本;
this.id=messages.get(0.getId();
}
公共int getId(){
返回id;
}
公共字符串getText(){
返回文本;
}
公共字符串getHeader(){
返回头;
}
公共列表getMessages(){
返回消息;
}
公共void插入消息(消息消息){
消息。添加(消息);
}
}


如果有任何帮助,我将不胜感激。

您的控制器似乎正常,您正在将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>
在本例中,
th:field
正在为输入标记创建
name
value
属性,因此您无需手动执行

总之,无法将对象的实际“实例”从客户端运行的html传递到服务器上运行的java应用程序,只能使用HTTP发送数据并在服务器上解析该数据。
ModelAttribute
注释指示Spring检查对象(在本例中为
MessageThread
),并在通过请求发送的数据中找到匹配值以填充对象


希望这有帮助。

谢谢您的回复。它变得更加清晰了。但现在我有了一个新问题。我添加了这个
,现在在处理器'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor'(模板:“线程视图”-第33行,第46列)的执行过程中出现了错误
错误
th:field
中尝试在java对象中使用属性的名称,而不是调用getId():
th:field=“*{id}”
。Thymeleaf将在内部调用
getId
方法。仍然存在错误。我尝试使用其他值,如
*{header}
*{text}
,结果是相同的。当我单击
newThread
按钮时,会出现错误。也许我的春季开机版本有问题?嗯。。。我不认为这是spring的问题,错误是由thymeleaf造成的。但是,再次查看您应该删除的控制器
params=“inThread”
。此外,也是最重要的一点,在模板中检查您是否正在
标记中添加输入字段。另外,语法
*{id}
将仅在带有
th:object
的标记内部工作。例如,基于模板:````bB\\\\\\\\\\\\\\```
<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>
<input type="hidden" th:field="*{header}" />
<input type="hidden" th:field="*{text}" />