Создание и перебор массива на языке шаблонов скорости - PullRequest
33 голосов
/ 25 мая 2011

Как создать массив в VTL и добавить содержимое в массив? Также как извлечь содержимое массива по индексу?

Ответы [ 3 ]

46 голосов
/ 27 июля 2012

Согласно Руководству пользователя Apache Velocity , правая часть назначений может иметь тип

  • Ссылка на переменную
  • Элемент списка
  • Строковый литерал
  • Ссылка на свойство
  • Ссылка на метод
  • Литерал числа
  • ArrayList
  • Карта

Youможно создать пустой список, который бы удовлетворял все ваши потребности в массиве, в шаблоне Apache Velocity с выражением, например:

#set($foo = [])

, или инициализировать значения:

#set($foo = [42, "a string", 21, $myVar])

затем,добавить элементы с помощью метода добавления Java:

$foo.add(53);
$foo.add("another string");

, но будьте осторожны, так как метод Java .add () для типа списка возвращает логическое значение, когда вы добавляете элемент в список, Velocity будет печатать,например, «true» или «false» в зависимости от результата функции «add».

Простой обходной путь - присвоение результата функции add переменной:

#set($bar = $foo.add(42))

Вы можете получить доступ к элементам списка, используя порядковые номера:

<span>$foo[1]</span>

Выражение выше покажет диапазон с текстом «строка».Однако самый безопасный способ получить доступ к элементам списка - использовать циклы foreach.

7 голосов
/ 30 июня 2016

Создать массив очень просто:

#set($array = [])

Поместить элемент в массив также легко:

$array.add(23)

Получение элемента из массива зависит от вашей версии Velocity. В Velocity 1.6 вы должны использовать

$array.get($index)

Начиная с Velocity 1.7 вы можете использовать классическую форму:

$array[$index]
1 голос
/ 12 июля 2011

Я не создал массив в VTL, но передал массивы в контекст VTL и использовал их.В VTL вы не можете извлекать содержимое массива по индексу, вы используете только foreach, например, этот код скопирован из моего скрипта VTL генерации динамического SQL:

#foreach( $col in $Columns ) SUM($col.DBColumn) AS ''$col.Name''#if($velocityCount!=$Columns.Count),   #end  #end 

По этой причине у нас также не может быть 2Dмассивы.Когда мне требовался массив для хранения двух объектов в строке, я использовал обходной путь определения нового класса и помещения объектов этого класса в одномерный массив.

...