2014-01-09 3 views
0

Может ли кто-нибудь предложить, как отсортировать этот список по скорости?Velocity foreach список сортировки

До сих пор я пытался

#foreach($it in ${pro.test}.sort(${pro.test.sortOrder})) 
    ......... 
    #end 

Но это бросает ошибку, Кроме того, я попытался с

#foreach($it in ${pro.test.sort(${pro.test.sortOrder})}) 
    ......... 
    #end 

на этот раз нет ошибок, но управление не заходя внутрь петли,

reference

+0

Какой тип объекта 'pro.test'? –

+0

@Sergiu Dumitriu спасибо за ваш ответ, это набор. Также я попытался с функцией $ sorter.sort(), а также вы можете сказать, где я ошибся –

ответ

2

Во-первых, использование ${...} - это способ помочь он анализатор 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().

+0

благодарит вас за ваше замечательное объяснение и время. Я скоро проверю ваш код. –

Смежные вопросы