是否可以在Freemarker模板中生成随机整数?
答案 0 :(得分:3)
Freemarker目前不提供随机数生成器。 您可以使用时间(.now)作为种子来实现一个天真的随机数生成器,但它永远不应该是您程序的关键部分。
答案 1 :(得分:2)
您可以在Java中生成随机整数,并将此整数传递给Freemarker模板。
答案 2 :(得分:2)
这是使用时间进行随机生成的简单实现,就像Kayhadrin建议的那样。我没有时间测试它是否真的有用,但可能对某人有帮助。
http://v01ver-howto.blogspot.fi/2011/07/howto-generate-random-integer-in.html
答案 3 :(得分:1)
另一种选择实际上是创建自己的Freemarker method并将其注入数据模型。
以下是有关如何在Java 8中执行此操作的示例:
public String generate(Map<String, Object> data, String templateLocation) throws IOException, TemplateException {
try (StringWriter writer = new StringWriter()) {
Template template = configuration.getTemplate(templateLocation);
data.put("uuid", (TemplateMethodModelEx) (list) -> UUID.randomUUID());
Random r = new Random();
// Adding method for generation of random number
data.put("randomNumber", (TemplateMethodModelEx) (list) -> r.nextInt(200));
template.process(data, writer);
return writer.toString();
}
}
在Freemarker模板中,您可以使用以下方法使用此方法:
${randomNumber()}
答案 4 :(得分:0)
假设您要向每个列出的项目添加随机图像。 因此,获取种子,然后以某种方式旋转该种子。
<#assign photos>
DSC_0005.jpg
DSC_0008.jpg
DSC_0013.jpg
DSC_0020.jpg
</#assign>
<#assign photos = photos?split('\\n', 'rmc') >
<#assign nextRandom = .now?string["HHmmssSSS"]?number>
<#list posts as post>
<div class="banner divider" style="background-image: url(photos/panoramas/${photos[nextRandom % photos?size]});"></div>
<#assign nextRandom = nextRandom * 13 % 104729>
</#list>
我选择了nextRandom = nextRandom * 13 % 104729
,但我敢打赌,从统计角度来看,这并不是很随机。另外,请确保104729大于您要迭代的集合。
至少对于HTML而言,更好的方法是将该集合放入JavaScript并从中进行选择:
<script type="text/javascript">
var photos = [ <#list photos as photo> '${photo}', </#list> ];
var randomPhoto = photos[Math.floor(photos.length * Math.random())];
</script>