Где Velocity ищет шаблон?
Мне нужно использовать Velocity из Java-кода в веб-приложении (я использую его как процессор почтовых шаблонов).
Итак, у меня есть стандартный код:
VelocityEngine ve = new VelocityEngine ();
try {
ve.init ();
Template t = ve.getTemplate (templatePath);
...
} catch (Exception e) {
throw new MailingException (e);
}
Этот код всегда выдает ResourceNotFoundException
. Где я должен размещать свои шаблоны в веб-приложении (WEB-INF? Classpath? И т.д.?) И как мне указывать путь (то есть, что я должен передать как templatePath
)?
Ответы
Ответ 1
Вам нужно сначала инициализировать скорость, вызывая Velocity.init()
(в модели использования Singleton) или VelocityEngine.init()
(если вы используете отдельный экземпляр) и передаете соответствующие параметры конфигурации. К ним относятся конфигурация загрузчика ресурсов.
Где разместить файлы шаблонов в зависимости от того, какой ресурсный загрузчик вы выберете - есть доступные загрузчики ресурсов, классов, jar, url и т.д.
Если вы используете загрузчик файлового ресурса, путь к шаблону должен быть абсолютным (путь каталога/файла). Однако при загрузке ресурса jar он не должен быть абсолютным путем (если ваши шаблоны находятся в банке, то есть). Это также верно для ссылок внутри ваших шаблонов, то есть если один из ваших шаблонов включает в себя другой по абсолютному пути, загрузчик ресурсов jar не сможет загрузить его.
Ответ 2
УСТАНОВКА ШАБЛОНОВ VELOCITY
Я решил использовать этот вопрос, чтобы решить мою проблему настройки пути к шаблону. Я использую скорость для шаблонов html-писем.
Вот несколько способов, которые вы можете использовать, которые иллюстрируют, как настроен путь к шаблону. Он устанавливает свойство file.resource.loader.path на абсолютный путь. Я создал каталог для шаблонов, а затем щелкнул правой кнопкой мыши на файле шаблона, чтобы получить полный путь (в Eclipse). Вы используете этот полный путь как значение свойства file.resource.loader.path. Я также добавил свойство runtime.log.logsystem.class и установил его, потому что получал исключения, жалующиеся на регистрацию.
МЕТОДЫ НЕКОТОРЫХ СКОРОСТИ
public static VelocityEngine getVelocityEngine(){
VelocityEngine ve = new VelocityEngine();
Properties props = new Properties();
// THIS PATH CAN BE HARDCODED BUT IDEALLY YOUD GET IT FROM A PROPERTIES FILE
String path = "/absolute/path/to/templates/dir/on/your/machine";
props.put("file.resource.loader.path", path);
props.setProperty("runtime.log.logsystem.class", "org.apache.velocity.runtime.log.NullLogSystem");
ve.init(props);
return ve;
}
public static String getHtmlByTemplateAndContext(String templateName, VelocityContext context){
VelocityEngine ve = getVelocityEngine();
Template template = ve.getTemplate(templateName);
StringWriter writer = new StringWriter();
template.merge(context, writer );
System.out.println( writer.toString());
String velocityHtml = writer.toString();
return velocityHtml;
}
КАК ИСПОЛЬЗОВАТЬ ВЫШЕ КОДЕКС, СОЗДАВАЯ КОНТЕКСТУ СКОРОСТИ К ПОДАЧЕ К МЕТОДУ НЕБОЛЬШОГО
Вот как вы можете использовать вышеуказанные методы. Вы просто указываете имя файла шаблона и создаете простой контекст VelocityContext
для хранения ваших переменных шаблона.
VelocityContext context = new VelocityContext();
context.put("lastName", "Mavis");
context.put("firstName", "Roger");
context.put("email", "[email protected]");
context.put("title", "Mr.");
String html = VelocityUtil.getHtmlByTemplateAndContext("email_template_2015_10_09.vm", context);
ПРИМЕР ШАБЛОН HTML
Доступ к переменным может быть как (в моем случае сохранен в файле email_template_2015_10_09.vm
):
<p> Hello $firstName $lastName </p>