Java 在Freemarker模板中加载模板,而不设置用于加载模板的目录或类

Java 在Freemarker模板中加载模板,而不设置用于加载模板的目录或类,java,freemarker,Java,Freemarker,是否有任何方法可以直接加载Freemarker模板,而无需首先加载将从中加载模板的目录,或设置将加载模板的类 i、 有没有什么方法可以加载这样的模板 Template template = getTemplate("PathToTemplate/myTemplate.ftl"); 我需要这个,因为用户指定了ftl文件的完整路径。所以,首先我必须分离目录名和文件名,然后我要 Configuration cfg = new Configuration(); int indexOfLast = t

是否有任何方法可以直接加载Freemarker模板,而无需首先加载将从中加载模板的
目录
,或设置将加载模板的

i、 有没有什么方法可以加载这样的模板

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

我不想做所有这些。

getTemplate方法重载严重。根据文档,不管您调用了哪个
getTemplate
方法,最终都会调用该方法

此方法的文档说明如下:

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

有两件值得注意的事情:

  • name
    参数已在处理分层路径,但不能以斜杠开头。因此,您可以将配置的目录设置为磁盘的根目录,然后只提供完整路径(但不带前导斜杠)

  • 该文档解释了有关一个应用程序的一些内容。因此,您可以简单地编写该接口的实现来加载模板。在该实现中,您完全可以使用提供的名称


  • getTemplate
    方法重载严重。根据文档,不管您调用了哪个
    getTemplate
    方法,最终都会调用该方法

    此方法的文档说明如下:

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

    有两件值得注意的事情:

  • name
    参数已在处理分层路径,但不能以斜杠开头。因此,您可以将配置的目录设置为磁盘的根目录,然后只提供完整路径(但不带前导斜杠)

  • 该文档解释了有关一个应用程序的一些内容。因此,您可以简单地编写该接口的实现来加载模板。在该实现中,您完全可以使用提供的名称


  • 可以通过直接调用
    模板
    构造函数来创建模板,将
    字符串
    读取器
    作为参数传递给构造函数。当然,你可以从任何你想要的地方得到
    阅读器
    字符串
    。但这种方法有两个缺点:

    • 其他模板将无法导入或包含这些模板,因为FreeMarker不知道如何加载它们(只有您知道)

    • 缓存这些模板(如果需要的话)由您决定

    如果以上两个问题对您来说是个问题,那么请参见Seelenvirtuose的答案:创建一个
    TemplateLoader
    ,将模板名称解释为完整路径


    对于示例代码,要知道每次更换
    TemplateLoader
    时,
    Configuration
    实例都会清除其模板缓存。还请注意,这样做不是线程安全的。

    可以通过直接调用
    模板
    构造函数来创建模板,将
    字符串
    读取器
    作为参数传递给构造函数。当然,你可以从任何你想要的地方得到
    阅读器
    字符串
    。但这种方法有两个缺点:

    • 其他模板将无法导入或包含这些模板,因为FreeMarker不知道如何加载它们(只有您知道)

    • 缓存这些模板(如果需要的话)由您决定

    如果以上两个问题对您来说是个问题,那么请参见Seelenvirtuose的答案:创建一个
    TemplateLoader
    ,将模板名称解释为完整路径


    对于示例代码,要知道每次更换
    TemplateLoader
    时,
    Configuration
    实例都会清除其模板缓存。还请注意,这样做不是线程安全的。

    直接加载Freemarker模板是什么意思?它是相对于什么东西的吗?或绝对?@konstantiv.Salikhov-Its在连接的网络上<代码>直接加载模板意味着我不需要两个步骤。首先,设置加载模板的目录或路径,然后
    config.getTemplate('templateFile.ftl')
    获取模板。相反,
    something.getTemplate('dir path/templateFile.ftl')
    直接加载Freemarker模板是什么意思?它是相对于什么东西的吗?或绝对?@konstantiv.Salikhov-Its在连接的网络上<代码>直接加载模板意味着我不需要两个步骤。首先,设置加载模板的目录或路径,然后
    config.getTemplate('templateFile.ftl')
    获取模板。而是
    something.getTemplate('dir path/templateFile.ftl')