任何人都可以建议如何按速度对此列表进行排序吗?
到目前为止,我试过
#foreach($it in ${pro.test}.sort(${pro.test.sortOrder}))
.........
#end
但这是错误,我也试过
#foreach($it in ${pro.test.sort(${pro.test.sortOrder})})
.........
#end
这次没有错误,但控件没有进入循环内,
答案 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.sortOrder
是SortTool
预期的有效排序顺序规范吗?
如果$pro.test
是Set
interface的标准实现,那么就没有sort
或sortOrder
方法。假设SortTool
变量下的Velocity $sorter
可用,您可以尝试,对于初学者:
#foreach ($it in $sorter.sort($pro.test))
...
#end
现在,$pro.test.sortOrder
应该是什么?如果它是属性,那么请注意,出于安全原因,Velocity不允许直接访问属性,它只能调用方法。作为简化语法的一种方法,$pro.test.sortOrder
实际上会尝试调用其中之一:getsortOrder()
,getSortOrder()
,get("sortOrder")
,issortOrder()
,{{1} }。