如何迭代Apache Velocity模板变量属性

时间:2019-04-12 10:49:18

标签: velocity

作为标题,是否有任何方法可以迭代或显示Apache Velocity模板属性?

例如,我有以下代码:

<code>
${ctx.messages.headerMessage}
</code>

我想知道变量$ {ctx}还有多少其他属性

1 个答案:

答案 0 :(得分:1)

仅可以发现并循环显示对象属性(即具有getter和/或setter的属性),如果可以将新工具添加到Velocity上下文中。如果不能这样做,那您就很困。

有几种方法可以做到这一点,下面我将说明如何使用commons-beanutils来实现这一点。

首先,在类路径中添加Apache commons-beanutils,然后从Java将其添加到Velocity上下文中:

import org.apache.commons.beanutils.PropertyUtils;
...
    context.put("beans", new PropertyUtils());
...

一句话:如果您没有访问Java部分的权限,但是如果碰巧commons-beanutils已经在类路径中,则有一种模糊的访问方式:#set($beans = $foo.class.forName('org.apache.commons.beanutils.PropertyUtils').newInstance())

然后,假设我有以下对象:

class Foo
{
    public boolean isSomething() { return true; }
    public String getName() { return "Nestor"; }
}

在我的上下文中位于$foo下。使用新的$beans属性自检器,您可以执行以下操作:

#set ($properties = $beans.getPropertyDescriptors($foo.class))
#foreach ($property in $properties)
  $property.name ($property.propertyType) = $property.readMethod.invoke($foo)
#end

这将产生:

  bar (boolean) = true
  class (class java.lang.Class) = class Foo
  name (class java.lang.String) = Robert

(当然,您需要过滤class属性)

不过,最后一句话。模板用于对MVC应用程序的View层进行编码,而在其中对对象进行这种一般的自省在View层中是远远不够的。您最好将所有自省代码移到Java端。