使用Apache Velocity(与SparkJava一起)和加载的模板

3
我正在使用Spark+Velocity构建一个网站。这个网站的网页中有很多类似的HTML组件,因此我把这些共享组件放在一些模板中,然后动态地将它们加载到页面中。
举个简单的例子,我有像这样的页面:
anyPage.vm
<head> stuff in here </head>
<body>
<div id="header"></div>
$AJavaObject.ToString() # <-- using the Velocity templating language
...
</body>
<script type="text/javascript">
    $(function(){
         $("#header").load("header.vm");
    }
</script>

这个方案大体可行,唯一的问题是header.vm内部的Velocity代码无法正常工作。 header.vm
<h1>Header</h1>
$AnotherJavaObject.toString()
header.vm文件中没有包含任何<head><body>标记。
在渲染页面时,我看到的不是AnotherJavaObject的字符串表示形式,而是实际的字符串$AnotherJavaObject.toString()
非常感谢您的帮助。谢谢。
2个回答

3

已解决

对于任何遇到同样问题的人,解决方案在Velocity模板引擎本身中:http://velocity.apache.org/engine/1.7/user-guide.html#parse

不需要在具有header id的组件上调用load(),你只需要有:

#parse("header.vm")

您需要将 header.vm 渲染到指定位置。

您应该使用 #include 指令来加载静态的、非Velocity模板,例如:

#include("other.html")

这并不是件轻松的事情。文档表明,#parse#include只能从TEMPLATE_ROOT加载资源。但是我无法确定该根目录的位置在哪里。因此,在初始化Velocity Engine时,我必须启用它来接受相对路径:
properties.setProperty(RuntimeConstants.EVENTHANDLER_INCLUDE, IncludeRelativePath.class.getName());
velocityEngine = new org.apache.velocity.app.VelocityEngine(properties);

1

在模板返回结果后,您无法在JavaScript中加载它。您应该使用解析器来查看Velocity加载资源

#parse("header.vm")

如果您需要隐藏它,请使用JavaScript来显示/隐藏结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接