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