Apache Velocity"主模板"?

hrm*_*fff 6 velocity template-engine

我是Apache Velocity的新手,我在确定构建模板的最佳方法时遇到了一些麻烦.在大多数指南中,我看到页面的构建方式如下:

#parse("header.vm")
<body>
    ...
</body>
#parse("footer.vm")
Run Code Online (Sandbox Code Playgroud)

我也看到有人用这种方法接近"主"模板:

<head>
    ...
</head>
<body>
#if($activeTab=="home")
    #parse("home.vm")
#elseif($activeTab=="aboutus")
    #parse("aboutus.vm")
...and so on.
</body>
Run Code Online (Sandbox Code Playgroud)

这似乎有点傻,但我猜它有效.

我经常使用Twirl,所以我可能会被宠坏,但是我想把模板注入另一个模板,最后用这样的主模板结束:

<head>
    ...
</head>
<body>
    $content
</body>
Run Code Online (Sandbox Code Playgroud)

然后将每个其他模板写为:

#parse(main){ 
    TEMPLATE CONTENT 
}
Run Code Online (Sandbox Code Playgroud)

这在Velocity中可能吗?如果是的话,这是不好的做法,如果是这样,为什么?谢谢.

Gel*_*Luo 5

Velocity本身不能为布局模板(您调用的主模板)提供良好的支持.但是,它们提供了一个名为Velocity Layout Servlet(VLS)的工具.

为了让您了解,像Rythm这样的其他模板解决方案通过模板继承机制(演示)提供了非常好的模板布局管理.免责声明:我是Rythm的作者,所以我可能会有一些偏见.但是,您可以查看由第三方创建的本文,以了解不同模板解决方案的优缺点.


小智 5

您可以使用该$!bodyContent变量。

mainLayout.vm:

#macro(mainLayout)
<head>
    ...
</head>
<body>
    $!bodyContent
</body>
#end
Run Code Online (Sandbox Code Playgroud)

索引.vm:

#@mainLayout()
  <h1>Index page</h1>
#end
Run Code Online (Sandbox Code Playgroud)