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 【问题描述】:

我正在使用带有 Thymeleafth: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:objectth: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

Thymeleaf/Spring - 将项目从组合框添加到表中

Spring + Thymeleaf 绑定表单 NullpointerException