Velocity foreach排序列表

时间:2014-01-09 09:02:13

标签: java foreach velocity

任何人都可以建议如何按速度对此列表进行排序吗?

到目前为止,我试过

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

但这是错误,我也试过

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

这次没有错误,但控件没有进入循环内,

reference

1 个答案:

答案 0 :(得分:2)

首先,使用${...}是一种帮助Velocity解析器准确知道您认为是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.sortOrderSortTool预期的有效排序顺序规范吗?

如果$pro.testSet interface的标准实现,那么就没有sortsortOrder方法。假设SortTool变量下的Velocity $sorter可用,您可以尝试,对于初学者:

#foreach ($it in $sorter.sort($pro.test))
   ...
#end

现在,$pro.test.sortOrder应该是什么?如果它是属性,那么请注意,出于安全原因,Velocity不允许直接访问属性,它只能调用方法。作为简化语法的一种方法,$pro.test.sortOrder实际上会尝试调用其中之一:getsortOrder()getSortOrder()get("sortOrder")issortOrder(),{{1} }。