Spring, Thymleaf и списки строк

Хорошо, я мокрая-за-уши новичок в Spring и Thymleaf. Я пытаюсь сделать что-то настолько простое, что это не должно быть проблемой. Но я не могу заставить его работать. Простой вопрос: как вы показываете список строк на веб-странице?

У меня есть следующая модель

import java.util.List;
public class TestModel {

    private List<String> list = null;
    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public List<String> getList() { return list; }

    public void setList(final List<String> list) {
        this.list = list;
    }
}

Моя веб-страница содержит следующее:

<div th:if="${greeting.list != null}">
    <h1>Result</h1>
    <ul>
    <th:block th:object="${greeting}" th:each="item : ${list}">
     <li th:text="${item.name}">Item description here...</li>
    </th:block>
    </ul>
</div>

Я добавил ".name" в "item" только потому, что нашел несколько примеров, где у них был список строк и что-то подобное. Но у них было ".name" на объекте.

Но это все еще не работает. Неупорядоченный список заканчивается пустым. То есть Внутри неупорядоченных тегов нет элементов списка.

Что я делаю неправильно? Указатели с радостью приняли.

Ответ 1

Поскольку нет примера заполнения модели, я предположил, что вы помещаете некоторые строки в пример поля списка TestModel, как это.

TestModel greeting= new TestModel();
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
model.addAttribute("greeting", greeting);

Затем в вашем примере шаблона Thymeleaf появляется больше ошибок.

  • Если вы используете выбор объекта через th:object, вы должны сначала использовать asterix * для доступа к свойствам объекта. Синтаксис Asterisk оценивает выражения для выбранных объектов вместо карты переменных контекста.
  • Выбор объекта влияет только на дочерние узлы в DOM.
  • В вашем примере вы хотите перебрать список строк (List<String>), но хотите получить доступ к свойству name, которое на самом деле не существует на Java String.

Вы должны исправить шаблон Thymeleaf в одном виде - см. примеры.

Нет выбора объекта вообще

<div th:if="${greeting.list != null}">
    <h1>Result</h1>
    <ul>
       <li th:each="item : ${greeting.list}" th:text="${item}">Item description here...</li>
    </ul>
</div>

Выбор подходящего объекта

<div th:if="${greeting.list != null}">
    <h1>Result</h1>
    <ul>
    <th:block th:object="${greeting}">
       <li th:each="item : *{list}" th:text="${item}">Item description here...</li>
    </th:block>
    </ul>
</div>

Ответ 2

<table th:object="${userList}" id="userTable" border="1">
    <tr th:each="user :${userList}">
        <td  th:text="${user.getName()}"></td>
        <td  th:text="${user.getEmail()}"></td>
    </tr>
</table>

Другой пример использования таблицы и объекта. Может быть полезно кому-то другому.