【问题标题】:Velocity, different template paths速度,不同的模板路径
【发布时间】:2012-10-01 07:55:21
【问题描述】:

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

【问题讨论】:

    标签: java velocity


    【解决方案1】:

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

    【讨论】:

    • 不久之后我发现了这个。就这么简单。谢谢!
    【解决方案2】:

    补充以上几点:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2018-06-07
          • 2018-08-25
          • 1970-01-01
          • 2018-03-31
          • 2011-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-27
          相关资源
          最近更新 更多