Как напечатать количество элементов в ArrayList HashMap, используя шаблон Thymeleaf? - PullRequest
0 голосов
/ 29 июня 2019

Я очень плохо знаком с программированием в целом и изучаю Java. Мы начали изучать Spring Boot и Thymeleaf, и нам нужно работать над приложением, в котором мы ищем вакансии по ключевым словам. Я создал обработчик, чтобы иметь возможность искать вакансии и добавлять их к ArrayList из HashMap, и иметь шаблон, который отображает эти результаты. Однако моя проблема в том, что мы должны каждый раз отображать количество результатов в верхней части страницы, и я не могу понять, как это сделать.

Я пытался использовать .size, #lists, #maps, th: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>

Я включил мой метод-обработчик и код из шаблона, с которым я работаю. Извините за все комментарии - я пытаюсь отследить то, что я пробовал.

Редактировать: теперь это мой шаблон кода, который печатает слово "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>

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Используйте 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>
0 голосов
/ 30 июня 2019

Ваш запрос очень подозрительный:

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 будет иметь свойства списка вакансий. Взгляните на 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>

Обратите внимание, что вы также будете создавать новые <table> на каждой итерации в исходном HTML. Я сомневаюсь, что ты этого хочешь.

Печать размера списка можно найти здесь .

Главный совет, который я также хотел бы написать, - написать свой код следующему программисту, который прочтет его. Используйте имена логических переменных и будьте проще. Это долгая дорога - держись там.

...