速度#parse但将其分配给变量

时间:2008-10-17 22:51:37

标签: java velocity template-engine

假设您有一个标准模板,其中包含(已解析的)标题,正文,页脚模板。

在body模板中定义了一个像$ subject这样的变量,你希望它也显示在标题模板中。

在其他一些模板语言中,例如HTML :: Mason(基于perl),你首先要评估body模板以获取$ subject变量,但是将它的输出临时存储在一个变量中,这样你的最终输出就会以正确的顺序结束(标题,正文,页脚)

在速度上,它看起来像

set($ body =#parse(“body.vm”))

解析( “header.vm”)

$ {体}

解析( “footer.vm”)

然而,这似乎不起作用,有关如何做到这一点的任何想法?

3 个答案:

答案 0 :(得分:10)

上述两种解决方案中的任何一种都可行。 VelocityLayoutServlet解决方案需要一个名为Velocity Tools的额外软件包(也来自Velocity)。我自己偏爱这种方法(和变种)。

第三种方法只是将#parse放在引号内:

set ($body="#parse('body.vm')")

在#set中,评估双引号中的任何内容。单引号中的字符串按字面顺序传递。

答案 1 :(得分:3)

您可以使用VelocityLayoutServlet中的VelocityTools来完成此操作。

这允许您为应用程序定义一个布局 - 让我们称之为application.vm - 您可以在其中解析页眉,页脚等,并使用{{1}声明主体内容的放置位置声明,例如:

screen_content

<html> <head> <title>$subject</title> </head> <body> #parse("header.vm") $screen_content #parse("footer.vm") </body> </html> 将在渲染之前评估模板(以及变量),这允许您在体模板中设置VelocityLayoutServlet变量,例如:

$subject

可以找到更详细的信息in the Velocity documentation

答案 2 :(得分:0)

如果我理解正确,您希望在$subjectheader.vm模板中插入名为body.vm的Velocity变量。目前,该变量已在body.vm模板中定义,因此您无法在早期模板header.vm中引用该变量。

为什么不将$ subject的定义抽象为自己的模板片段,称为globals.vm,然后将其包含在顶级模板中。所以你有:

#parse("globals.vm")
#parse("header.vm")
#parse("body.vm")
#parse("footer.vm")