使用 Thymeleaf、Java 和 Spring MVC 更新 HTML 数据 table

Updating an HTML data table using Thymeleaf, Java and Spring MVC

我正在使用 Java 11Spring Boot 2.1.2Thymeleaf Spring 5.

开发一个简单的 Planning Poker MVC 应用程序

所附图片显示了 HTML 主页。登录后,用户提交分数。该请求转到下面粘贴的控制器方法,其中分数被保存到数据库中。然后,从数据库中检索该组的整组分数作为列表。用户的个人分数和组分数列表都被添加到模型中,用户被转发到 poker.html 页面

@PostMapping("/score")
public String submitScores(@Valid SimplePoker simplePoker, BindingResult result, Model model) {
    SimplePoker poker = simplePokerRepository.save(simplePoker);
    model.addAttribute("poker_score", poker);

    Iterable<SimplePoker> scores = simplePokerRepository.findAll();
    model.addAttribute("scores", scores);
    return "poker";
}

在poker.html页面上,使用标准Thymeleaf模式生成table,如下图:-

<div class="container" th:if="${not #lists.isEmpty(scores)}">
    <table class="table table-striped table-hover table-bordered table-responsive-md">
        <thead class="thead-dark">
        <tr>
            <th class="text-center, align-middle">Name</th>
            <th class="text-center, align-middle">Planning</th>
            <th class="text-center, align-middle">Business Risk</th>
            <th class="text-center, align-middle">Chance of Failure</th>
            <th class="text-center, align-middle">Total Risk</th>
        </tr>
        </thead>
        <tbody>
        <tr th:each="score: ${scores}">
            <td th:text="${score.name}"></td>
            <td th:text="${score.planningScore}"></td>
            <td th:text="${score.risk1Score}"></td>
            <td th:text="${score.risk2Score}"></td>
            <td th:text="${score.risk3Score}"></td>
        </tr>
        </tbody>
    </table>
</div>

这一切都很好,但当然 table 只代表用户发出请求时的结果。我想在 table(黄色突出显示区域)正下方添加一个 'Update Table' 按钮,用户可以单击该按钮以获取一组新数据并更新页面上的 table最新结果。由于我主要是一名后端开发人员,我在这里有点挣扎,非常感谢您的指导。

我想我可以创建一个粗略的解决方案,点击按钮只会刷新整个页面,但如果能够只更新 table 会更流畅。锦上添花的是 table 每几秒自动更新一次,无需用户单击按钮。但作为第一步,实现一个按钮来更新 table 会很棒。

非常感谢您阅读我的 post 并提供任何帮助。

您可能想查看 htmx。这是一个 JavaScript 库,可以避免自己编写 JavaScript 来做你需要的事情。

您可以像这样添加周期刷新:

<div hx-trigger="every 1s"
     hx-get="/table" >
</div>

您可以在整个页面的初始呈现时将其添加到您的 Thymeleaf 模板中。之后 htmx 将每 1 秒在 /table 上执行一次 GET。

在您的控制器中,您应该 return 构建 table 所需的 HTML。如果 table 是 Thymeleaf 片段,那么您可以重复使用该片段:

@Controller
public class MyController {
  @GetMapping("/table")
  public String getTable(Model model) {
    // first fill up your model using .addAttribute

    // return the fragment
    return "fragments :: table"
  }
}

This example does something similar. See also TodoMVC with Thymeleaf and HTMX 了解有关结合 Thymeleaf 与 htmx 的一些额外背景信息。