Где 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>