我最近一直在摆弄 Spring MVC 5 和 Thymeleaf 3.0,并注意到一些奇怪的事情。我已经开始根据网站上的教程实现下拉列表,并注意到一些性能问题。如果我使用以下代码,我的页面大约需要 5.5 秒才能呈现大约 100 个项目的下拉列表。
<select th:field="*{item}">
<option th:each="item : ${items}"
th:value="${item.getId()}"
th:text="${item.getValue()}"></option>
</select>
另一方面,如果我使用以下代码,我的页面将在大约 150 毫秒内呈现。
<div th:each="item : ${items}">
<span th:text="${item.getId()}"/>
<span th:text="${item.getValue()}"/>
</div>
我已经循环遍历控制器中的项目列表并打印出这些值,以查看从数据库获取数据是否有任何减慢,但是从控制器中抓取项目是立即发生的。我还尝试在 select 标记中渲染不同的 html 元素以进行测试,即使它不是有效的 html,它仍然可以快速渲染页面。
我唯一一次在页面渲染上遇到极大的延迟是当我在选项的 select 标签内使用 th:each 时。 Thymeleaf 处理选择标签的方式不同吗?我认为,如果相同的项目列表,调用相同的方法可以通过循环 div 在 130 毫秒内渲染页面,那么它应该能够以相当的速率创建选项,而不是花费 5.5 秒。
以前有人遇到过这样的问题吗?我做了一些搜索,发现 Thymeleaf 中存在循环性能问题,但这些案例有超过 100,000 条记录,而我的列表大约有 100 条。任何帮助将不胜感激。
Update
我已将问题范围缩小到在 th:field="*{item}" 上表现不佳。如果我运行以下代码,页面会立即加载。
<select>
<option th:each="item : ${items}"
th:value="${item.getId()}"
th:text="${item.getValue()}"></option>
</select>
一旦我尝试使用 th:field="*{item}" 绑定选择,页面就会挂起大约 5.5 秒。使用 th:field 进行绑定是否会导致延迟问题?