J'ai un problème avec le passage d'un exemple de « fils » dans chaque boucle de thymeleaf au contrôleur Spring en utilisant un bouton d'envoi. Je suis en train de résoudre ce problème en utilisant le @ModelAttribute d'annotation, mais un exemple de plus MessageThread crée.
<!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>
Je ne peux pas trouver un moyen de passer une instance de « fils » de serpolet. Tout ce que je veux est d'appuyer sur le bouton Soumettre et passer le $ {} fil à la méthode « toThread ».
Mon contrôleur:
@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:";
}
}
classe 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);
}
}
Je vous serais reconnaissant pour toute l'aide apportée.
votre contrôleur semble être ok, vous mappez une demande de poste à « / » et attend de recevoir un objet MessageThread qui doit être construit à partir du contenu de la demande, le problème est dans le modèle: vous n'êtes pas envoyer les données dans la demande du client au serveur, le printemps n'a aucun moyen d'affecter les valeurs correctes à une nouvelle instance de MessageThread.
Si nous prenons ce bloc à partir du modèle:
<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 balise form manque l'attribut d'action, essayez d' ajouter quelque chose comme th:action="@{/}"
à cibler votre demande de cartographie sur le côté serveur.
2) Vous n'envoyez pas le contenu réel de l'objet thread au serveur, pour cela, vous devez ajouter des balises d'entrée avec le nom de l'imput correspondant au nom du champ dans l'objet MessageThread que vous voulez remplir. Quelque chose comme ce qui suit:
<input type="hidden" th:field="*{header}" />
<input type="hidden" th:field="*{text}" />
Dans cet exemple th:field
crée les name
et value
attributs pour les balises d'entrée de sorte que vous n'avez pas besoin de le faire manuellement.
En résumé, il n'y a pas moyen de passer une « instance » réelle d'un objet à partir du code html en cours d' exécution dans le client à l'application Java en cours d' exécution sur le serveur, vous ne pouvez envoyer des données à l' aide de HTTP et d' analyser les données sur le serveur. L' ModelAttribute
annotation est instruisait printemps pour inspecter un objet ( MessageThread
dans ce cas) et trouver dans les données envoyées par la demande , les valeurs correspondantes pour remplir l'objet.
J'espère que cela t'aides.