速度,不同的模板路径

时间:2012-10-01 07:55:22

标签: java velocity

有谁知道是否可以通过速度从不同路径获取模板?初始化后,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初始化,它就不能用不同的属性重置。关于如何解决这个问题的任何建议?

可能的计划流程:

  1. 用户选择需要填入模板的组
  2. 用户选择要使用的模板(可以位于硬盘驱动器的任何位置)
  3. 用户按下生成

4 个答案:

答案 0 :(得分:22)

Velocity可以通过两种方式使用:singleton model or the separate instance model。您当前正在使用单例模型,其中只允许JVM中的一个Velocity引擎实例。

相反,您应该使用单独的实例模型,该模型允许您在同一JVM中创建Velocity的多个实例,以支持不同的模板目录。

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

答案 1 :(得分:2)

在第3步之前,请考虑使用单身Velocity类创建和初始化新的VelocityEngine

答案 2 :(得分:2)

添加到以上几点:

即使使用非单例模型,即使用VelocityEngine对象。可以通过为属性提供逗号分隔值来配置多个路径。

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

在这种情况下,速度引擎将首先在path1中查找模板,然后在path2中查找模板

答案 3 :(得分:0)

在我的情况下,我在Eclipse动态Web项目中使用Velocity和Servlet 我实际上无法重置路径,但我可以在/ WebContent文件夹下放置一个子目录,然后以这种方式组织我的模板......并且还有嵌套的子目录。

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

这个简单的解决方案就是我所需要的......不需要在web.xml中混淆velocity.properties或以编程方式设置它们(在每种情况下,当我尝试时,这两种方法都不适用于我)。

请注意,当我使用#parse(..)命令执行模板时,我需要在模板.vm文件中使用相同的路径前缀,就像我在servlet的示例代码中所做的那样。