Apache Velocity:如何像 Java 那样定义自定义方法?

Apache Velocity: How to define a custom method like in Java?

我目前在 Polarion 应用程序 ALM 软件中编写了一个 wiki 页面,这些页面上的语法包括(据我所知)HTML、Javascript 和 Apache Velocity。

所以我想在 Apache Velocity 中编写一个脚本,因为我认为这是访问 Polarion 工作项的最佳方式,因为有预定义的方法。

现在我想编写一个方法来遍历一堆工作项并将它们的 ID 收集到列表或数组中。

所以我只想像 Java (http://www.tutorialspoint.com/java/java_methods.htm) 那样定义一个新方法,但是我在网上找不到任何地方在 Velocity 中是如何完成的(我还搜索了 "functions Apache Velocity" 也没有结果)。

这是否可能,或者如果我想编写自己的 methods/functions,我是否必须使用 Java 脚本?

这是可以做到的,用你想在速度模板中使用的方法创建一个静态的class。在速度上下文对象中设置此 class。

velocityContext.put("anyKey",YourStaticClass.class)

此 class 将在速度模板中可用。然后您可以访问它的方法,如:anyKey.Method()

也许您正在寻找宏? http://people.apache.org/~henning/velocity/html/ch07.html

上面的片段link:

这是一个带有两个参数的 Velocimacro,一个颜色和一个对象列表:

#macro( tablerows $color $values )
  #foreach( $value in $values )
    <tr><td bgcolor=$color>$value</td></tr>
  #end
#end

#set( $greatlakes = ["Superior","Michigan","Huron","Erie","Ontario"] )
#set( $color = "blue" )

<table>
  #tablerows( $color $greatlakes )
</table>

tablerows 宏正好有两个参数。第一个参数代替 $color,第二个参数代替 $values。任何可以放入 VTL 模板的东西都可以放入 Velocimacro 的主体。

请注意 $greatlakes 取代了 $values。呈现此模板时,将生成以下输出:

<table>
<tr><td bgcolor="blue">Superior</td></tr>
<tr><td bgcolor="blue">Michigan</td></tr>
<tr><td bgcolor="blue">Huron</td></tr>
<tr><td bgcolor="blue">Erie</td></tr>
<tr><td bgcolor="blue">Ontario</td></tr>
</table>