Java Velocity#解析,但将其分配给变量

Java Velocity#解析,但将其分配给变量,java,velocity,template-engine,Java,Velocity,Template Engine,假设您有一个包含(已解析)页眉、正文和页脚模板的标准模板 在主体模板中定义了一个变量,如$subject,您希望它也显示在标题模板中 在其他一些模板语言中,如HTML::Mason(基于perl),您将首先计算主体模板以获取$subject变量,但将其输出临时存储在一个变量中,以便最终输出的顺序正确(页眉、主体、页脚) 在速度上,它看起来像 set($body=#parse(“body.vm”)) 解析(“header.vm”) ${body} 解析(“footer.vm”) 然而,这似乎不起作

假设您有一个包含(已解析)页眉、正文和页脚模板的标准模板

在主体模板中定义了一个变量,如$subject,您希望它也显示在标题模板中

在其他一些模板语言中,如HTML::Mason(基于perl),您将首先计算主体模板以获取$subject变量,但将其输出临时存储在一个变量中,以便最终输出的顺序正确(页眉、主体、页脚)

在速度上,它看起来像

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

解析(“header.vm”)

${body}

解析(“footer.vm”)

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

您可以使用的一部分

这允许您为应用程序定义布局——我们称之为
application.vm
——您可以在其中解析页眉、页脚等内容,并使用
屏幕内容
声明声明主体内容的位置,例如:

<html>
  <head>
    <title>$subject</title>
  </head>
  <body>
  #parse("header.vm") 
  $screen_content
  #parse("footer.vm") 
  </body>
</html>

可以找到更详细的信息。

如果我理解正确,您希望在
header.vm
body.vm
模板中插入一个名为
$subject
的速度变量。现在,变量是在
body.vm
模板中定义的,因此您不能在早期的模板
header.vm
中引用它

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

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

上述两种解决方案中的任何一种都会起作用。VelocityLayoutServlet解决方案需要一个名为Velocity工具的额外包(也来自Velocity)。我自己也偏爱这种方法(和变体)

第三种方法是简单地将#parse放在引号中:

set ($body="#parse('body.vm')")
在#集合中,双引号中的任何内容都将被计算。单引号内的字符串按字面形式传递

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