如何迭代 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 端。
如题,请问有什么方法可以迭代或显示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 端。