You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Thymeleaf中当列表为空时显示页面提示信息

问题:空交易列表时页面提示未显示

我需要在用户未创建任何交易的情况下,在Transactions页面展示「您尚未创建任何交易」的提示。控制器在空列表时会打印「Empty」,但页面提示始终不显示,尝试了相关判断方法仍未解决。

控制器代码

@GetMapping("/userTransactions/{user_id}")
public String getUserTransactions(@PathVariable("user_id") long user_id, TransactionGroup transactionGroup, Model model) {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    UserDetailsImpl user = (UserDetailsImpl) authentication.getPrincipal();
    long userId = user.getId();
    model.addAttribute("userId", userId);

    List<Transaction> transactions = transactionRepository.getTransactionsByUserId(user_id);
    List<TransactionGroup> transactionByDate = new ArrayList<>();
    List<Transaction> transOnSingleDate = new ArrayList<>();
    boolean currDates = transactions.stream().findFirst().isPresent();

    if (currDates) {
        LocalDate currDate = transactions.get(0).getDate();

        TransactionGroup transGroup = new TransactionGroup();

        for (Transaction t : transactions) {
            if (!currDate.isEqual(t.getDate())) {
                transGroup.setDate(currDate);
                transGroup.setTransactions(transOnSingleDate);
                transactionByDate.add(transGroup);
                transGroup = new TransactionGroup();
                transOnSingleDate = new ArrayList<>();
            }

            transOnSingleDate.add(t);
            currDate = t.getDate();
        }
        transGroup.setDate(currDate);
        transGroup.setTransactions(transOnSingleDate);

        transactionByDate.add(transGroup);
    } else {
        System.out.println("Empty");
        model.addAttribute("transactionGroup", "NoData");
    }
    model.addAttribute("transactionGroup", transactionByDate);
    return "transactions";
}

Thymeleaf模板代码

<div class="date" th:each="singleGroup  : ${transactionGroup}">
    <h1 th:text="${singleGroup .date}"></h1>
    <div class="transaction" th:each="singleTrans  : ${singleGroup.transactions}">
        <h2>Amount: <span th:text="${singleTrans.amount}"></span></h2><br>
        <h2>Note: <span th:text="${singleTrans.note}"></span></h2><br>
        <h2>Wallet name: <span th:text="${singleTrans .walletName}"></span></h2><br>
        <h2>Expense Category: <span th:text="${singleTrans .expenseCategories}"></span></h2><br>
        <h2>IncomeCategory: <span th:text="${singleTrans .incomeCategories}"></span></h2>
        <a class="card__link" th:href="@{/api/transaction/delete/{id}(id=${singleTrans.id})}"
           th:data-confirm-delete="|Are you sure you want to delete ${singleTrans.walletName} wallet?|"
           onclick="if (!confirm(this.getAttribute('data-confirm-delete'))) return false">Delete</a>
        <hr>
    </div>
    <th:block th:if="${transactionGroup=='NoData'}"> No Data Found </th:block>
</div>

问题原因分析

  1. Model属性被覆盖:
    在else分支中你设置了model.addAttribute("transactionGroup", "NoData"),但之后无论分支如何,都会执行model.addAttribute("transactionGroup", transactionByDate),这会直接覆盖之前的设置。空数据时transactionByDate是空的ArrayList,页面拿到的是空列表而非字符串"NoData",导致判断条件${transactionGroup=='NoData'}永远不成立。

  2. 提示块位置错误:
    提示块放在了th:each="singleGroup : ${transactionGroup}"的div内部,当transactionGroup为空列表时,循环不会执行,内部的提示块自然不会被渲染。


解决方案

修改控制器代码

去掉无效的"NoData"属性设置,保持transactionByDate为空列表即可,可额外添加布尔属性方便页面判断:

@GetMapping("/userTransactions/{user_id}")
public String getUserTransactions(@PathVariable("user_id") long user_id, TransactionGroup transactionGroup, Model model) {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    UserDetailsImpl user = (UserDetailsImpl) authentication.getPrincipal();
    long userId = user.getId();
    model.addAttribute("userId", userId);

    List<Transaction> transactions = transactionRepository.getTransactionsByUserId(user_id);
    List<TransactionGroup> transactionByDate = new ArrayList<>();
    List<Transaction> transOnSingleDate = new ArrayList<>();
    boolean currDates = transactions.stream().findFirst().isPresent();

    if (currDates) {
        LocalDate currDate = transactions.get(0).getDate();

        TransactionGroup transGroup = new TransactionGroup();

        for (Transaction t : transactions) {
            if (!currDate.isEqual(t.getDate())) {
                transGroup.setDate(currDate);
                transGroup.setTransactions(transOnSingleDate);
                transactionByDate.add(transGroup);
                transGroup = new TransactionGroup();
                transOnSingleDate = new ArrayList<>();
            }

            transOnSingleDate.add(t);
            currDate = t.getDate();
        }
        transGroup.setDate(currDate);
        transGroup.setTransactions(transOnSingleDate);

        transactionByDate.add(transGroup);
    } else {
        System.out.println("Empty");
        // 空数据时保持transactionByDate为空即可
    }
    model.addAttribute("transactionGroup", transactionByDate);
    // 添加布尔属性标记是否有交易
    model.addAttribute("hasTransactions", !transactionByDate.isEmpty());
    return "transactions";
}

修改Thymeleaf模板

将提示块移到循环外部,通过布尔属性判断是否显示:

<!-- 空状态提示 -->
<div th:if="${!hasTransactions}">
    <p>您尚未创建任何交易</p>
</div>

<!-- 有交易时渲染列表 -->
<div class="date" th:each="singleGroup : ${transactionGroup}" th:if="${hasTransactions}">
    <h1 th:text="${singleGroup.date}"></h1>
    <div class="transaction" th:each="singleTrans : ${singleGroup.transactions}">
        <h2>Amount: <span th:text="${singleTrans.amount}"></span></h2><br>
        <h2>Note: <span th:text="${singleTrans.note}"></span></h2><br>
        <h2>Wallet name: <span th:text="${singleTrans.walletName}"></span></h2><br>
        <h2>Expense Category: <span th:text="${singleTrans.expenseCategories}"></span></h2><br>
        <h2>IncomeCategory: <span th:text="${singleTrans.incomeCategories}"></span></h2>
        <a class="card__link" th:href="@{/api/transaction/delete/{id}(id=${singleTrans.id})}"
           th:data-confirm-delete="|Are you sure you want to delete ${singleTrans.walletName} wallet?|"
           onclick="if (!confirm(this.getAttribute('data-confirm-delete'))) return false">Delete</a>
        <hr>
    </div>
</div>

也可以不添加额外属性,直接用Thymeleaf的列表工具类判断:

<th:block th:if="${#lists.isEmpty(transactionGroup)}">
    <p>您尚未创建任何交易</p>
</th:block>

<div class="date" th:each="singleGroup : ${transactionGroup}" th:unless="${#lists.isEmpty(transactionGroup)}">
    <!-- 交易列表内容 -->
</div>

内容的提问来源于stack exchange,提问作者Frosty Nah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:57