速度,不同的模板路径

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

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

考虑在步骤3之前使用单独的Velocity类创建和初始化新的VelocityEngine 。

添加到以上几点:

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

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

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

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

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

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

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