Во-первых, использование ${...}
- это способ помочь он анализатор Velocity точно знает, что вы считаете кодом скорости. Обычно, когда скорость видит $something.somethingElse.somethingMore
, она пытается разобрать столько, сколько она может, пока не увидит символ нарушения слова, например пробел или запятую. Когда он видит ${something.somethingElse}.somethingMore
, он читает только до соответствия }
как действительный код, остальное - обычный текст. Это означает, что ${pro.test}.sort(...)
рассматривает .sort(...)
как обычный текст, который должен быть напечатан, поэтому он не будет называть его как метод. Вот почему первый пример завершился с ошибкой. Вам нужно использовать только формальные синтаксисы внешних директив, однако вы можете просто удалить все {
и }
из вызова, когда внутри #foreach(...)
.
Во-вторых, #foreach
очень слабый, он не жалуется, когда вы пытаетесь передать что-то недействительное в итерированной области; если он не разрешает действительный список, то он просто игнорирует его и считает, что нечего перебирать. Когда что-то не работает должным образом, напечатайте значения, с которыми вы работаете:
$pro.test $pro.test.class $pro.test.sortOrder $pro.test.sortOrder.class
#foreach ($it in ${pro.test.sort(${pro.test.sortOrder})})
...
#end
Что это значит? Есть $pro.test
действительно набор? Является $pro.test.sortOrder
действительной спецификацией порядка сортировки, как ожидается, SortTool
?
Если $pro.test
стандартная реализация Set
interface, то нет sort
или sortOrder
метода. Если предположить, что скорость SortTool
доступен по переменной $sorter
, вы могли бы попробовать, для начала:
#foreach ($it in $sorter.sort($pro.test))
...
#end
Теперь, что именно $pro.test.sortOrder
должен быть? Если это свойство, то обратите внимание, что по соображениям безопасности Velocity не разрешает доступ непосредственно к свойствам, он может вызывать только методы. В качестве средства упрощения синтаксиса $pro.test.sortOrder
на самом деле попытается назвать один из них: getsortOrder()
, getSortOrder()
, get("sortOrder")
, issortOrder()
, isSortOrder()
.
Какой тип объекта 'pro.test'? –
@Sergiu Dumitriu спасибо за ваш ответ, это набор. Также я попытался с функцией $ sorter.sort(), а также вы можете сказать, где я ошибся –