这种逻辑(重复数据删除)可能是您的视图(速度)层中应该避免的。下列的模型-视图-控制器 https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller,最好让这个逻辑由控制器类管理,让 Velocity 模板简单地渲染它传递的数据结构。
例如,通过使用诸如java.util.Set
,不会接受重复项,因此不需要模板去重复。
我个人找到了 Rob Harrop 的专业雅加达速度 http://www.apress.com/9781590594100这是一本非常好的 MVC 指南,尤其是第 4 章“在 MVC 环境中使用 Velocity”。
让模型使用集合,让控制器代码填充集合,然后可以像现在一样使用模板代码中的简单循环。
一般来说,在视图层中实现的逻辑越少越好。它还将使您的代码更易于测试,因此您可以验证其行为,而无需启动演示组件、应用程序服务器等。
如果确实没有选择并且逻辑绝对必须编写在模板中,那么以下实现了所提供的伪代码:
#set($displayed = [])
#foreach( $element in $myList )
#if(!$displayed.contains($element))
$element.field1 ($element.field2) issued by $element.field ($element.field4 )
<br><br>
#set($ignore = $displayed.add($element))
#end
#end
注意混乱的情况#set($ignore = $displayed.add($element))
- 必须这样做才能抑制输出java.util.List
's add()
方法(布尔值)被输出。不在模板代码中编写此内容的另一个原因!
当然,您还需要确保equals()
在添加到列表中的类型上正确实现,以便列表操作 -contains()
and add()
正常工作。
绝对是比上面的 MVC 方法差的解决方案,但作为最后的选择而提出。