Java 速度,不同的模板路径

Java 速度,不同的模板路径,java,velocity,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.a

有人知道是否有可能以速度从不同路径获取模板吗?初始化后,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);
}
模板可以位于不同的位置(用户可以通过文件对话框选择一个)。因此,在从velocity中取出模板时,我有了这段代码

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));
}
这是行不通的。似乎一旦速度被初始化,它就不能用不同的属性重置。对如何解决这个问题有什么建议吗

可能的程序流程:

  • 用户选择需要填充到模板中的组
  • 用户选择要使用的模板(可以位于hdd上的任何位置)
  • 用户按生成

  • 考虑在第3步之前,不要使用singleton
    Velocity
    类创建和初始化new。

    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");
    

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

    RequestDispatcher requestDispatcher = 
     request.getRequestDispatcher("/velocity_templates/index.vm");
    
    这个简单的解决方案就是我所需要的。。。不需要弄乱web.xml中的velocity.properties或以编程方式设置它们(在每种情况下,当我尝试时,这两种方法都不适用于我)


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

    添加到上述要点:

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

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

    在这种情况下,velocity引擎将首先在path1中查找模板,然后在path2中查找模板。。就这么简单。非常感谢。