如何使用Thymeleaf模板打印HashMap的ArrayList中的元素数量?

时间:2019-06-29 18:00:13

标签: java loops spring-boot hashmap thymeleaf

对于一般的编码我还是很陌生的,并且一直在学习Java。我们已经开始学习Spring Boot和Thymeleaf,我们必须在一个应用程序上工作,在该应用程序中使用关键字搜索工作。我创建了一个处理程序,能够搜索作业并将其添加到ArrayList的{​​{1}}中,并具有显示这些结果的模板。但是,我的问题是我们应该每次在页面顶部显示结果数,而我不知道该怎么做。

我尝试使用HashMap.size#lists#maps,这些都是我能想到的。什么都没用。我尝试将其放在表格上方,表格中,循环之间,所有内容之间。我最近得到的只是在页面顶部打印“结果”一词。我一直在阅读Thymeleaf教程,看着Baeldung,谷歌搜索了好几天。 非常感谢您的协助!

th:size

还有Thymeleaf:

@RequestMapping(value = "results")
public String search(
    Model model,
    @RequestParam String searchType,
    @RequestParam String searchTerm
) {
    ArrayList<HashMap<String, String>> results =
            JobData.findByColumnAndValue(searchType, searchTerm);
    model.addAttribute("columns", ListController.columnChoices);
    model.addAttribute("results", results);
    return "search";
}

我已经包含了我的处理程序方法以及正在使用的模板中的代码。抱歉,所有评论-我正在努力跟踪自己的尝试。

编辑:现在这是我的模板代码,仅在进行搜索(所需)后才显示“结果”字样。现在的问题是我仍然无法打印结果数量。

<hr />
<!--<span th:text="${results.size}">Result</span> -->
<!--<span th:text="${#lists.size(job.results)}">Result(s)</span> -->
<!-- <td th:text="${#lists.size(job.results)}">Result(s)</td> -->

<!-- TODO #2 - Loop over jobs map to display all job fields -->
<!--<div th:fragment="div"> -->

<table  class="job-listing" th:each="job : ${results}">
    <tr th:each="row : ${job}">
        <!--<td th:text="${results.size}"></td>-->
        <td th:text="${row.key}"></td>
        <td th:text="${row.value}"></td>
    </tr>
</table>
</div>
<!--    </table>-->
<!--</div> -->
</body>
</html>

2 个答案:

答案 0 :(得分:1)

使用list.size()map.size()来获取模板中的尺寸:

例如:

<td th:text="${results.size()}"></td>
<td th:text="${job.size()}"></td>

要检查th:if中的大小,请使用以下命令:

<div th:if="${results.size() > 0}">
    ...
</div>

或者这个:

<div th:if="${!results.isEmpty()}">
    ...
</div>

答案 1 :(得分:0)

您在这里的查询非常可疑:

ArrayList<HashMap<String, String>> results =
        JobData.findByColumnAndValue(searchType, searchTerm);

首先,您正在静态调用服务。这可能不是您想要的。阅读静态方法。

第二,您的查询返回地图列表。对于简单的查询而言,这可能太复杂了。我强烈建议为模型提供一个简单的List。您可能希望在页面上打印results.size.size以获取所需的内容,但是我不建议您使用这种方法。

一种更清晰的方法是执行以下操作:

List<JobListing> jobListings =
        jobDataService.findByColumnAndValue(searchType, searchTerm);
model.addAttribute("jobListings", jobListings);

您的新JobListing bean将具有工作清单的属性。如果您的项目允许其他依赖项,请看一下Lombok项目,使使用bean的生活更加轻松。尤其要注意@Data@Builder

看看jobDataService的构造函数注入。注入服务可以使代码随着应用程序的增长而变得更具适应性。

那么您将简单地拥有:

Results Found: <span th:text="${#lists.size(jobListings)}" remove="tag">[0]</span>

<table class="job-listing">
    <tr th:each="jobListing : ${jobListings}">
        <td th:text="${jobListing.id}">[Id]</td>
        <td th:text="${jobListing.createdOn}">[Creation Date]</td>
        <!-- or whatever your requirements dictate -->
    </tr>
</table>

请注意,您还将在原始HTML的每次迭代中创建一个新的<table>。我对此表示怀疑。

可以打印列表的大小here

我还要指出的主要技巧是编写您的代码,以供下一个程序员阅读。使用逻辑变量名并使事情简单。这条路很长-挂在那里。