如何为Apache Velocity创建自定义指令

mch*_*erm 6 apache velocity

我正在使用Apache的Velocity模板引擎,我想创建一个自定义指令.也就是说,我希望能够编写"#doMyThing()"并让它调用我编写的一些java代码来生成文本.

我知道我可以通过添加一行来注册自定义指令

userdirective=my.package.here.MyDirectiveName
Run Code Online (Sandbox Code Playgroud)

到我的velocity.properties文件.而且我知道我可以通过扩展指令类来编写这样的课程.我不知道的是如何扩展指令类 - 为新指令的作者提供某种文档.例如,我想知道我的getType()方法是否返回"BLOCK"或"LINE",我想知道我的setLocation()方法应该做什么?

有没有比" 使用源,卢克 " 更好的文档?

ser*_*erg 8

我整理了一篇关于编写自定义速度指令(和工具)的文章.也许有人会发现它很有用.


Nat*_*bna 2

块指令始终接受主体,并且在模板中使用时必须以 #end 结尾。例如 #foreach( $i in $foo ) 这有一个主体!#结尾

行指令没有主体或#end。例如 #parse( 'foo.vtl' )

您根本不需要同时使用 setLocation() 。解析器使用它。

我还可以帮忙提供其他具体信息吗?

另外,您是否考虑过使用“工具”方法?即使您不使用 VelocityTools 自动使您的工具可用等等,您也可以创建一个执行您想要的操作的工具类,将其放在上下文中,并且具有您调用的方法来生成内容,或者仅具有其toString() 方法生成内容。例如 $tool.doMyThing() 或只是 $myThing

当您需要处理 Velocity 内部结构(访问 InternalContextAdapter 或实际节点)时,指令是最好的选择。