Использование 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 для отображения / скрытия результатов.

Другие вопросы по тегам