作为标题,是否有任何方法可以迭代或显示Apache Velocity模板属性?
例如,我有以下代码:
<code>
${ctx.messages.headerMessage}
</code>
我想知道变量$ {ctx}还有多少其他属性
答案 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端。