在Freemarker模板中加载模板,无需为模板加载设置目录或类

时间:2014-07-24 07:10:54

标签: java freemarker

是否有任何方法可以直接加载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);

我不想做这一切。

2 个答案:

答案 0 :(得分:2)

getTemplate方法严重超载。根据文档,无论您调用哪种getTemplate方法,最终都会调用方法getTemplate(String, Locale, String, boolean)

此方法的文档表达以下内容:

  

名称的确切语法由底层TemplateLoader解释,但缓存会做出一些假设。首先,名称应该是一个分层路径,路径组件用斜杠字符分隔(不用反斜杠!)。这里给出的路径(名称)不能以斜线开头;它总是相对于“模板根目录”进行解释。

有两件值得注意的事情:

  1. name参数已在处理分层路径,但不能以斜杠开头。所以也许您可以将配置目录设置一次到磁盘的根目录,然后只提供完整路径(但没有前导斜杠)。

  2. 该文档解释了TemplateLoader的内容。因此,您可以简单地编写该接口的实现来加载模板。在该实现中,您可以完全掌握所提供的名称

答案 1 :(得分:2)

可以通过直接调用Template构造函数来创建模板,您可以将StringReader作为参数传递给它。当然,您可以从任何地方获得ReaderString。这种方法有两个缺点:

  • 其他模板无法#import#include这些模板,因为FreeMarker不知道如何加载它们(只有你这样做)

  • 缓存这些模板(如果需要的话)取决于你

如果以上两个问题适合您,请参阅Seelenvirtuose的回答:创建一个TemplateLoader,将模板名称解释为完整路径。

从示例代码开始,每次更换Configuration时,都要知道TemplateLoader实例将清除其模板缓存。另请注意,它不是线程安全的。