Java 为什么这个Spring Boot/Thymeleaf按钮隐藏了我的数据或者根本不起作用?

Java 为什么这个Spring Boot/Thymeleaf按钮隐藏了我的数据或者根本不起作用?,java,spring,forms,spring-boot,thymeleaf,Java,Spring,Forms,Spring Boot,Thymeleaf,我现在正试图通过以下教程和它们提供的代码来进入SpringBoot和Thymeleaf。我尝试实现一个额外的功能,但遇到了以下问题:代码应该显示一个ToDo列表,由ToDo对象组成,每个ToDo对象都有一个名称、描述和一个布尔状态,表示它们是否完成。表格的每一行都应该有一个按钮可以单击,以便将ToDo标记为已完成 <table style="border-collapse:collapse; font-family: Arial,Arial,sans-serif;"> <

我现在正试图通过以下教程和它们提供的代码来进入SpringBoot和Thymeleaf。我尝试实现一个额外的功能,但遇到了以下问题:代码应该显示一个ToDo列表,由ToDo对象组成,每个ToDo对象都有一个名称、描述和一个布尔状态,表示它们是否完成。表格的每一行都应该有一个按钮可以单击,以便将ToDo标记为已完成

<table style="border-collapse:collapse; font-family: Arial,Arial,sans-serif;">
    <tr>
        <th padding: 5px"></th>
        <th> To-Do</th>
        <th> Description</th>
        <th> Done?</th>
    </tr>
    <tr th:each="todo : ${todos}">


        <td>
            <!-- <form method="POST" th:action="@{/updateDone(exactToDo=${todo})}">
                <button type="submit" name="submit" value="value" class="link-button">Done</button>
            </form> -->

            <form method="POST" th:action="@{/updateDone}">
                <input type="hidden" name="exactToDo" id="exactToDo" th:value="${todo.getName()}" />
                <button type="submit" name="submit" value="value" class="link-button" >This is a link that sends a POST request</button>
            </form>
        </td>

        <td th:utext="${todo.name}" style="border: 1px solid black;">...</td>
        <td th:utext="${todo.description}" style="border: 1px solid black;">...</td>
        <td th:text="${todo.done} ? 'Yes! ' : 'No' " style="border: 1px solid black;">...</td>
    </tr>
</table>
将return设置为“redirect:/list”修复了“消失”数据的问题,但ToDo的状态仍然没有改变。我假设问题在于ToDo对象没有正确发送到方法,但我不确定原因。您可能已经注意到,我正在尝试直接发送todo.getName()而不是todo对象,这是因为当我尝试发送对象时,在发布的控制器代码的第二行中出现错误,告诉我字符串无法转换为todo对象(当然,控制器被配置为将ToDo对象作为参数)。这就是为什么我认为问题一定存在的原因

如果有人能帮我解决这个问题,或者告诉我一种更好的方法,让HTML页面上的按钮激活我Java代码中的方法,我将不胜感激。我也非常感谢提供良好学习资源的提示。我正在尝试学习Spring和Thymeleaf,以便为Java程序制作用户界面

谢谢您抽出时间!

第一件事

为什么仅仅为了一个按钮就需要写这么多(表单)?现在,如果“必须”使用表单,那么表单标记中就缺少th:object=“${todo}”。这将有助于控制器了解您将对什么对象采取一些操作

但是我建议你在你的“td”块中使用这个,而不是一个表单。它会为你做同样的工作。一旦你的请求成功,你可以将它重定向到你的列表中,你应该会看到新的结果立即得到反映

 <a href="/updateDone" th:href="@{/updateDone}">Mark Done</a>


您可以参考一个完整的示例。在这里,您会发现两件事。用户控制器和任务控制器可能会让您感兴趣。

对于以后可能会发现这一点的任何人,以下是答案:

Ajay Kumar发布的链接最终起到了作用,并进行了一些调整,包括必要的参数:


谢谢您的回答!我一定会仔细查看您链接的项目。我使用表单是因为它允许我发送POST请求而不是GET。我的理解是这样做更好。我不确定我是否正确理解您的解决方案。添加th:object=“${todo}”我的表单没有更改任何内容,我不明白该方法如何在您的第二个解决方案中获得所需的参数。我设法找到了一个解决方案,将参数包含在链接中。我仍然很好奇使用POST请求是否更好?无论如何,感谢您的帮助!
 <a href="/updateDone" th:href="@{/updateDone}">Mark Done</a>