Как получить случайное целое число в шаблоне Freemarker? - PullRequest
5 голосов
/ 10 сентября 2010

Можно ли сгенерировать случайное целое число в шаблоне Freemarker ?

Ответы [ 5 ]

3 голосов
/ 08 июля 2011

Freemarker на данный момент не предоставляет генератор случайных чисел. Вы можете реализовать наивный генератор случайных чисел, используя время (.now) в качестве начального числа, но оно никогда не должно быть критической частью вашей программы.

2 голосов
/ 03 октября 2012

Вот простая реализация случайной генерации с использованием времени, как предлагает Кайхадрин. У меня не было времени проверить, действительно ли это работает, но я могу кому-то помочь.

* ** 1003 тысяча два *http://v01ver -howto.blogspot.fi / 2011/07 / HOWTO-генерации случайных-целое число-in.html
2 голосов
/ 17 сентября 2010

Вы можете сгенерировать случайное целое число в Java и передать его в шаблон Freemarker.

1 голос
/ 30 августа 2017

Другой вариант - создать собственный метод Freemarker и внедрить его в модель данных.

Вот пример того, как сделать это в 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()}
0 голосов
/ 27 июля 2018

Допустим, вы хотите добавить случайное изображение из некоторого набора к каждому перечисленному элементу. Итак, возьмите семя, а затем поверните это семя каким-то образом.

<#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 больше, чем коллекция, которую вы повторяете.

См. Справочник по специальным переменным Freemarker .


Лучшим подходом, по крайней мере для HTML, было бы поместить эту коллекцию в JavaScript и выбрать ее оттуда:

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

Смотри, например, Math.random () в MDN.

...