Где Velocity ищет шаблон? - PullRequest
       4

Где Velocity ищет шаблон?

17 голосов
/ 12 июля 2010

Мне нужно использовать 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)?

Ответы [ 2 ]

11 голосов
/ 12 июля 2010

Сначала необходимо инициализировать Velocity, вызвав Velocity.init() (в модели синглтона) или VelocityEngine.init() (если вы используете отдельный экземпляр) и передав соответствующие параметры конфигурации. К ним относятся конфигурация загрузчика ресурсов .

Где разместить файлы шаблонов, зависит от того, какой загрузчик ресурсов вы выберете - есть доступные загрузчики файлов, classpath, jar, url и т. Д.

Если вы используете загрузчик файловых ресурсов, путь к шаблону должен быть абсолютным (каталог / файл). Однако с загрузчиком ресурсов jar он не должен быть абсолютным путем (если ваши шаблоны находятся внутри jar). Это также верно для ссылок в ваших шаблонах, т. Е. Если один из ваших шаблонов включает другой по абсолютному пути, загрузчик jar-ресурсов не сможет его загрузить.

9 голосов
/ 11 октября 2015

НАСТРОЙКА ШАБЛОНОВ СКОРОСТИ

Я решил использовать этот вопрос для решения проблемы с настройкой пути к шаблону. Я использую скорость для шаблонов писем в формате 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", "mrRogers@wmail.com");
        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>
...