是否有任何方法可以直接加载Freemarker模板,而无需先加载要加载模板的Directory
,也可以设置相对于要加载模板的Class
。
即有什么方法可以加载像
这样的模板Template template = getTemplate("PathToTemplate/myTemplate.ftl");
我需要这个,因为用户指定ftl
文件的完整路径。所以,首先我必须分开目录名和文件名,然后我正在做
Configuration cfg = new Configuration();
int indexOfLast = templatePath.lastIndexOf("\\");
String dir = templatePath;
String fileName="";
if(indexOfLast>=0){
dir = templatePath.substring(0,indexOfLast);
fileName= templatePath.substring(indexOfLast+1,templatePath.length());
}
cfg.setDirectoryForTemplateLoading(new File(dir));
Template template = cfg.getTemplate(fileName);
我不想做这一切。
答案 0 :(得分:2)
getTemplate
方法严重超载。根据文档,无论您调用哪种getTemplate
方法,最终都会调用方法getTemplate(String, Locale, String, boolean)
。
此方法的文档表达以下内容:
名称的确切语法由底层TemplateLoader解释,但缓存会做出一些假设。首先,名称应该是一个分层路径,路径组件用斜杠字符分隔(不用反斜杠!)。这里给出的路径(名称)不能以斜线开头;它总是相对于“模板根目录”进行解释。
有两件值得注意的事情:
name
参数已在处理分层路径,但不能以斜杠开头。所以也许您可以将配置目录设置一次到磁盘的根目录,然后只提供完整路径(但没有前导斜杠)。
该文档解释了TemplateLoader
的内容。因此,您可以简单地编写该接口的实现来加载模板。在该实现中,您可以完全掌握所提供的名称。
答案 1 :(得分:2)
可以通过直接调用Template
构造函数来创建模板,您可以将String
或Reader
作为参数传递给它。当然,您可以从任何地方获得Reader
或String
。这种方法有两个缺点:
其他模板无法#import
或#include
这些模板,因为FreeMarker不知道如何加载它们(只有你这样做)
缓存这些模板(如果需要的话)取决于你
如果以上两个问题适合您,请参阅Seelenvirtuose的回答:创建一个TemplateLoader
,将模板名称解释为完整路径。
从示例代码开始,每次更换Configuration
时,都要知道TemplateLoader
实例将清除其模板缓存。另请注意,它不是线程安全的。