Скорость, разные шаблоны шаблонов

Кто-нибудь знает, можно ли получить шаблоны с разных путей со скоростью? После инициализации Velocity отказывается изменить файл file.resource.loader.path.

Это мой код:

public Generator(){         
    Properties p = new Properties();
        p.setProperty("resource.loader", "file");
        p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
        p.setProperty("file.resource.loader.path", "");

    Velocity.init(p);
}

Шаблоны могут быть расположены в разных местах (пользователь может выбрать один с диалоговым окном файла). Таким образом, у меня есть этот код при извлечении шаблона из скорости

private Template fetch (String templatePath) {
    out_println("Initializing Velocity core...");
    int end = templatePath.lastIndexOf(File.separator); 

    Properties p = new Properties();
        p.setProperty("file.resource.loader.path", templatePath.substring(0, end));
    Velocity.init(p);

    return Velocity.getTemplate(templatePath.substring(end+1));
}

Это не работает. Кажется, что после запуска Velocity он не может быть reset с разными свойствами. Любые предложения по решению этой проблемы?

Возможный поток программы:

  • Пользователь выбирает группу, которая должна быть заполнена в шаблоне
  • Пользователь выбирает шаблон для использования (может быть расположен в любом месте на hdd)
  • Пользователь пресет генерирует

Ответ 1

Скорость может использоваться двумя способами: модель singleton или отдельная модель экземпляра. В настоящее время вы используете модель singleton, в которой разрешен только один экземпляр механизма Velocity в JVM.

Вместо этого вы должны использовать отдельную модель экземпляра, которая позволяет создавать несколько экземпляров Velocity в одной JVM, чтобы поддерживать разные каталоги шаблонов.

VelocityEngine ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, "path/to/templates");
ve.init();
Template t = ve.getTemplate("foo.vm");

Ответ 2

Вместо использования singleton Velocity class создайте и инициализируйте новый VelocityEngine до шага 3.

Ответ 3

Добавление к приведенным выше пунктам:

Даже если вы используете не-синглтонную модель, используя объект VelocityEngine. Несколько путей можно настроить, указав значения, разделенные запятой, на свойство.

[file.resource.loader.class=path1,path2]

В таком случае двигатель скорости будет искать шаблон в пути1 сначала, а затем в path2

Ответ 4

В моем случае я использую Velocity с сервлетами в динамическом веб-проекте Eclipse.
Я не мог на самом деле reset путь, но я мог бы поставить подкаталог в папке /WebContent, а затем организовать мои шаблоны таким образом... и также иметь вложенные подкаталоги.

RequestDispatcher requestDispatcher = 
 request.getRequestDispatcher("/velocity_templates/index.vm");

Это простое решение было всем, в чем я нуждался... не нужно было возиться с speed.properties в web.xml или устанавливать их программно (в каждом случае ни один подход не работал у меня, к сожалению, когда я пытался).

Обратите внимание, что когда я делаю шаблон с командой #parse (..), мне нужно использовать тот же самый префикс пути внутри файла .vm шаблона, как и в примере кода для моего сервлета.