【问题标题】:How do I print the number of elements in an ArrayList of a HashMap using a Thymeleaf template?如何使用 Thymeleaf 模板打印 HashMap 的 ArrayList 中的元素数?
【发布时间】:2019-11-11 04:02:50
【问题描述】:

总的来说,我对编码非常陌生,并且一直在学习 Java。我们已经开始学习 Spring Boot 和 Thymeleaf,我们必须开发一个使用关键字搜索工作的应用程序。我创建了一个处理程序,以便能够搜索作业并将它们添加到ArrayListHashMap,并有一个显示这些结果的模板。但是,我的问题是我们应该每次在页面顶部显示结果数量,我不知道该怎么做。

我已经尝试过使用.size#lists#mapsth:size,我能想到的一切。没有任何工作。我试过把它放在桌子上方,桌子里,循环之间,一切。我得到的最接近的只是在页面顶部打印“结果”一词。我一直在阅读 Thymeleaf 教程,查看 Baeldung,谷歌搜索了好几天。 我非常感谢任何帮助!

@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>

我已经包含了我的处理程序方法,以及我正在使用的模板中的代码。对不起所有的 cmets - 我正在尝试跟踪我尝试过的内容。

编辑:现在这是我的模板代码,仅在我进行搜索(我想要的)后才打印单词“Result(s)”。我现在的问题是我仍然无法打印结果数。

<span th:if="${results} and ${results.size()}">
    <h3>Result(s)</h3>
</span>

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

【问题讨论】:

    标签: java loops spring-boot hashmap thymeleaf


    【解决方案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>
    

    【讨论】:

    • 当我在我的表格中执行此操作时,它会打印结果的数量,但会多次打印 - 每个作业都在表格内,而不是仅在页面顶部。我现在已经在上面添加了我的模板代码,这表明只有在我进行搜索(这是我想要的)之后,我才能让它打印出单词“Result(s)”,但我仍然无法得到它用这个词打印结果的数量。
    • @picturecharity 只是使用这个条件${results.size() &gt; 0}。我据此更新了我的答案。
    • 成功了!我做了

      非常感谢您的帮助!
    【解决方案2】:

    您在此处的查询非常可疑:

    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 将具有工作列表的属性。如果您的项目允许附加依赖项,请查看 Project 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 的每次迭代中创建一个新的&lt;table&gt;。我怀疑这是你想要的。

    打印列表的大小可以找到here

    我还有一个主要提示是编写您的代码以供下一个程序员阅读。使用逻辑变量名称并保持简单。这是一条很长的路 - 坚持下去。

    【讨论】:

    • 感谢 cmets。这是一个赋值,很多代码已经给我们写好了,包括一个HashMap的ArrayList,所以不能改。我现在在我的 html 模板中有一个循环的代码,使用 th:if 以便它仅在我进行搜索(这是我想要的)后将单词“Result(s)”打印到屏幕上,但我仍然可以't get it to print the number of results (我现在已经在上面添加了那个代码)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2023-03-08
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多