Использование Apache Velocity (с SparkJava) с загруженными шаблонами
Я строю веб-сайт, используя 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>
Это работает хорошо, за исключением того факта, что код Velocity внутри header.vm
не сработает
header.vm
<h1>Header</h1>
$AnotherJavaObject.toString()
Header.vm не содержит никаких <head>
или же <body>
мечение.
При отображении страницы вместо просмотра строкового представления AnotherJavaObject
Я вижу фактическую строку $AnotherJavaObject.toString()
,
Любая помощь приветствуется. Благодарю.
2 ответа
РЕШИТЬ
Для тех, кто сталкивается с такой же проблемой, решение находится в самом движке шаблонов Velocity: http://velocity.apache.org/engine/1.7/user-guide.html
Вместо звонка 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);
Вы не можете загрузить его в JavaScript после того, как шаблон вернет результаты. Вы должны использовать parse см. Velocity Loading resources:
#parse("header.vm")
И если вам нужно скрыть это, используйте JavaScript для отображения / скрытия результатов.