Spring 和 Thymeleaf:将对象从 th:each 表发送到控制器
Posted
技术标签:
【中文标题】Spring 和 Thymeleaf:将对象从 th:each 表发送到控制器【英文标题】:Spring and Thymeleaf: Sending an object to a controller from a th:each table 【发布时间】:2015-09-04 17:28:21 【问题描述】:我正在使用带有 Thymeleaf 的 th:each 属性制作一个体验数据表,我的目标是在每一行中都有一个提交按钮,当点击该按钮时,将向我的控制器发送一个体验对象,该对象与我单击提交按钮所在的行相对应。
我不知道出了什么问题,而且似乎无法在网上找到任何可以帮助解决此问题的东西。
这是我的网页代码部分:
<div th:unless="$#lists.isEmpty(borrower.experiences)">
<h2>List of Experiences</h2>
<!-- <form ACTION="#" th:action="@/initiate-edit" th:object="$experience"
method="POST">-->
<table id="your-table-id">
<thead>
<tr>
<td>Edit Buttons</td>
<th>Date Planted</th>
<th>Rating</th>
<th>Category</th>
<th>Dept</th>
<th>Resolution</th>
<th>Source</th>
<th>Last Update Date</th>
<th>Last Update Name</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
<tr th:each="experience : $borrower.experiences">
<td>
<form ACTION="#" th:action="@/initiate-edit"
th:object="$experience" method="POST">
<!--<a th:href="@/initiate-edit/">CLICK</a>-->
<button type="submit">Submit</button>
</form>
</td>
<td th:text="$experience.experienceDate">13/01/2014</td>
<td th:text="$experience.rating">4</td>
<td th:text="$experience.categoryShortDesc">Account and Billing</td>
<td th:text="$experience.deptDesc">Account and Billing</td>
<td th:text="$experience.resolutionShortTx">Account and Billing</td>
<td th:text="$experience.source">Account and Billing</td>
<td th:text="$experience.lastUpdateDate">Account and Billing</td>
<td th:text="$experience.lastUpdatedName">Account and Billing</td>
<td th:text="$experience.commentsShort">Account and Billing</td>
</tr>
</tbody>
</table>
</div>
这是我将其发送到的方法:
@RequestMapping(value = "/initiate-edit", method = RequestMethod.POST)
public String initiateEdit(@AuthenticationPrincipal final User user,
@ModelAttribute("SpringWeb")CustomerExperience editableExperience, final Model model)
LOG.info("THIS IS A TEST!!!" + editableExperience.getSsn());
model.addAttribute("editableExperience", editableExperience);
return EDIT_PAGE;
【问题讨论】:
你应该描述你的问题是什么。据我所知,您提交了一个不发送数据的表单。首先,您要提交的数据应在您的表单中。 很抱歉,这是我在 Stack Overflow 上的第一篇文章,所以我仍在试图弄清楚它是如何工作的,哈哈。但我的问题是我试图将“体验”对象(位于我的 th:object 标签内)发送到我的控制器方法。我想访问整个对象本身,而不仅仅是在表中创建的数据行。这更有意义吗? 是的,我明白了,看看 Aeseir 的回答,这就是我所说的。虽然我必须说我会使用 javascript 【参考方案1】:在发送输入时,您需要在表单中填写输入:
<form ACTION="#" th:action="@/initiate-edit" th:object="$experience" method="POST">
<input type="hidden" th:field="*experienceDate"/>
<input type="hidden" th:field="*rating"/>
<!-- ADD ALL THE OTHER FIELDS THAT ARE PART OF THE OBJECT -->
<button type="submit">Submit</button>
</form>
这将对用户隐藏您的对象数据,但是当他们单击提交时,它将根据需要发送对象数据(而不是像您当前那样发送空表单)。
【讨论】:
好吧,这是有道理的。当我最初点击网页时,我从我的控制器发送了一个“借款人”对象,您可以看到我使用它来访问借款人的所有个人体验。一旦按下提交按钮,有什么方法可以将整个借用对象发送回我的控制器?还是我只能提交输入? 除非您公开借阅者,否则不会(为每个字段生成输入)。您可以使用 webflow 做到这一点,但那是另一袋可能导致更多问题的芯片。 “暴露借款人”是什么意思? 您正在尝试发送借用对象,这意味着您必须公开借用对象。即在表单中显示借用对象的每个字段,以便在提交时 Spring 可以将其绑定到借用对象。 好的,我明白你在说什么!感谢您的帮助!您肯定帮助我了解了更多 Spring/Thymeleaf 功能【参考方案2】:作为@Aeseir 的回答,需要注意th:object
和th:field
field
可以是 int、double、String、List 并且对象应该具有其字段的 getter 和 setter。
在这种情况下
public class Experience
String field;
List<String> list;
//getter() and setter()
【讨论】:
【参考方案3】:我遇到了同样的问题。 @Aeseir 所说的对我有帮助,但不是:
<input type="hidden" th:field="*experienceDate"/>
我需要使用:
<input type="hidden" th:value="$experience.experienceDate" name="someName"/>
【讨论】:
以上是关于Spring 和 Thymeleaf:将对象从 th:each 表发送到控制器的主要内容,如果未能解决你的问题,请参考以下文章
spring thymeleaf - 从 html 表中删除对象并将 id 传递给控制器
使用 Spring Boot 显示从 MySQL 到 Thymeleaf 的文件(pdf、doc、ppt)
控制器从 Thymeleaf 发送空对象 - Spring Boot
如何使用 Spring Security 和 Thymeleaf 获取当前登录用户的 ID