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