gpt4 book ai didi

java - 将每个循环中的对象实例从 thymeleaf html 文件传递​​到 Spring Controller

转载 作者:行者123 更新时间:2023-11-30 05:19:48 26 4
gpt4 key购买 nike

我在使用提交按钮将每个循环中的“线程”实例从 thymeleaf 传递到 Spring Controller 时遇到问题。我试图通过使用注释 @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>

我找不到从 thymeleaf 传递“线程”实例的方法。我想要的只是按“提交”按钮并将 ${thread} 传递给“toThread”方法。

我的 Controller :

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

}

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

最佳答案

你的 Controller 似乎没问题,你正在将一个发布请求映射到“/”并期望接收一个必须根据请求内容构建的 MessageThread 对象,问题出在模板中:你没有发送客户端向服务器请求的数据,所以spring没有办法给新的MessageThread实例分配正确的值。

如果我们从您的模板中获取此 block :

<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 正在为输入标记创建 namevalue 属性,因此您无需执行此操作手动。

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

希望这有帮助。

关于java - 将每个循环中的对象实例从 thymeleaf html 文件传递​​到 Spring Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59750599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com