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

How to iterate Apache velocity template variable attributes

如题,请问有什么方法可以迭代或显示Apache velocity模板属性吗?

例如,我有以下代码:

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

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

只能发现和循环对象属性(即具有 getter and/or setter 的属性)如果 您可以添加一个新工具到你的速度上下文。如果你做不到,那你就被困住了。

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

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

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

备注:如果您无权访问 Java 部分,但如果碰巧 commons-beanutils 已经在 class 路径中,则有一种 hakish 方式可以访问它:#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 应用程序的视图层进行编码,并且在视图层中对其中的对象进行这种通用的内省是相当不足的。您最好将所有这些内省代码移到 Java 端。