首先,使用${...}
是一种帮助t他速度分析器确切地知道你认为是速度代码。通常情况下,当速度看到$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()函数以及您能否告诉我出错的地方 –