有谁知道是否可以通过速度从不同路径获取模板?初始化后,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初始化,它就不能用不同的属性重置。关于如何解决这个问题的任何建议?
可能的计划流程:
答案 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的示例代码中所做的那样。