如何在Freemarker模板中获取随机整数?

时间:2010-09-09 20:22:38

标签: random integer freemarker

是否可以在Freemarker模板中生成随机整数?

5 个答案:

答案 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大于您要迭代的集合。

请参见box pops out


至少对于HTML而言,更好的方法是将该集合放入JavaScript并从中进行选择:

<script type="text/javascript">
    var photos = [ <#list photos as photo> '${photo}', </#list> ];
    var randomPhoto = photos[Math.floor(photos.length * Math.random())];
</script>

例如参见Freemarker special variables reference在MDN。