Thymeleaf-将集合转换为有序列表

时间:2019-08-27 14:03:08

标签: thymeleaf

我们有一个Set<String>要打印到Thymeleaf中的页面:

<h5>Unique Students names</h5>
<ol>
   <div th:each="uniqueName: ${course.uniqueStudentsNames}">
       <li th:text="${uniqueName}"></li>
   </div>
</ol>

因为它是Set<String>,所以集合中的项目没有顺序。

我们希望将无序Set<String>转换为顺序List<String>,因此我们将能够通过ABC打印它。由于这是一个UI问题,因此我们不希望后端更改其数据结构。

我们考虑的一个选项是在模型中创建这样的列表:

  model.addAttribute("course", course);
  model.addAttribute("orderedList", /* convert Set to ordred List */);

但这似乎很奇怪,因为模型需要处理这样的UI问题。

在Thymeleaf中有办法吗?

2 个答案:

答案 0 :(得分:1)

将其实例化为TreeSet(您可能正在使用hashset?),并且具有一个具有所需排序行为的集合。 Set<String>(实际上是Set<anything>)保证不会有重复的商品,但这并不意味着有关订单/无订单。

另一方面,作为模板引擎的百里香不会做诸如向未实现它的集合中添加订购行为的事情。它所要做的最多就是允许您访问集合的方法。对于集合:set utility methods

如果无论您想使用非有序集合,都必须使用javascript之类的东西来操纵客户端上的项目以对其进行排序。

答案 1 :(得分:0)

使用Thymeleaf实用程序方法将对象转换为List${#lists.toList(object)}

然后根据需要从那里执行sort的实用程序操作,可以选择使用您自己的Comparator

current Thymeleaf source code显示toList()方法将检查目标对象是否为Iterable的实例。就您而言,Set实现了该接口。

要引用外部链接:

if (target instanceof Iterable<?>) {
    final List<Object> elements = new ArrayList<Object>(10);
    for (final Object element : (Iterable<?>)target) {
        elements.add(element);
    }
    return elements;
}