13

有谁知道是否可以通过速度从不同路径获取模板?初始化后 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

4 回答 4

24

Velocity 可以以两种方式使用:单例模型或分离实例模型。您当前正在使用单例模型,其中仅允许 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");
于 2012-10-01T08:07:14.163 回答
2

考虑在第 3 步之前不要使用单例Velocity类创建和初始化新的VelocityEngine 。

于 2012-10-01T08:03:39.417 回答
2

补充以上几点:

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

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

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

于 2016-02-15T17:53:54.367 回答
0

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

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

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

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

于 2013-07-04T22:34:14.737 回答