同福

Java的FreeMarker模板引擎的几种模板加载方式【20210418】

介绍

介绍

上一课福哥带着大家学习了Java的FreeMarker模板引擎的使用技巧,其实FreeMarker除了可以通过指定模板根目录的方式加载模板外,还有非常多的个性化的模板加载方式,在不同的场合下使用适合的加载方式会让我们编写代码更加方便,同时运行效率也会更高。

FreeMarker支持的模板加载方式包括字符串加载(StringTemplateLoader)、类加载(ClassTemplateLoader)、文件加载(FileTemplateLoader)、网址加载(URLTemplateLoader)、Webapp加载(WebappTemplateLoader)以及复合加载(MultiTemplateLoader)这么多种方式,今天福哥就带着大家一一学习一下。

目录加载

这是最简单也最直观的方式,上一课福哥给大家讲解的教程就是采用这种方式。

首先通过Configuration对象的setDirectoryForTemplateLoading方法设置模板根目录。

然后通过Configuration对象的getTemplate方法指定具体模板文件。

Configuration configuration = new Configuration(Configuration.getVersion());
Template template;
Map data = new LinkedHashMap();
StringWriter stringWriter = new StringWriter();

configuration.setDirectoryForTemplateLoading(new File(System.getProperty("user.dir") + "/src/main/resources/template"));
template = configuration.getTemplate("test.ftl");

字符串加载

这种方式就是通过字符串描绘模板文件内容的方式,比较适用于简单的页面的情况,例如:错误提示页面、跳转中转页面等等。

StringTemplateLoader

示例:使用StringTemplateLoader实现一个跳转页面的模板。

Configuration configuration = new Configuration(Configuration.getVersion());
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
Template template;
Map data = new LinkedHashMap();
StringWriter stringWriter = new StringWriter();

stringTemplateLoader.putTemplate("test.ftl", "<meta http-equiv=\"refresh\" content=\"0; url=${url}\" />" +
        "<script>" +
        "document.location='${url}';" +
        "</script>");
configuration.setTemplateLoader(stringTemplateLoader);
template = configuration.getTemplate("test.ftl");

data.put("url", "https://tongfu.net/");

template.process(data, stringWriter);

return stringWriter.toString();

类加载

类加载方式就是指定一个类,这个类的定义文件所在的目录就是模板文件的根目录,这样的好处是可以将模板文件分散开来部署,避免集中部署带来的冲突问题。

ClassTemplateLoader

示例:使用类加载方式调用控制器类所在目录下面的模板输出网页。

Configuration configuration = new Configuration(Configuration.getVersion());
ClassTemplateLoader classTemplateLoader = new ClassTemplateLoader(DemoController.class, "template/");
Template template;
Map data = new LinkedHashMap();
StringWriter stringWriter = new StringWriter();

configuration.setTemplateLoader(classTemplateLoader);
template = configuration.getTemplate("test.ftl");

data.put("url", "https://tongfu.net/");

template.process(data, stringWriter);

return stringWriter.toString();

不过在SpringBoot项目里面这样的设计似乎不能正常运行,只能放到resources目录下面,然后通过在路径前面增加“/”指明从resources目录开始查找,这样也就和指定什么类没有关系了。

示例:使用类加载方式调用resources/template/test.ftl模板输出网页。

Configuration configuration = new Configuration(Configuration.getVersion());
ClassTemplateLoader classTemplateLoader = new ClassTemplateLoader(DemoController.class, "/template/");
Template template;
Map data = new LinkedHashMap();
StringWriter stringWriter = new StringWriter();

configuration.setTemplateLoader(classTemplateLoader);
template = configuration.getTemplate("test.ftl");

data.put("url", "https://tongfu.net/");

template.process(data, stringWriter);

return stringWriter.toString();

home/topic/2021/0418/20/e4289adefdaea7875afb52d05dc7657c.jpg

文件加载

这里虽然说的是文件加载,但其实就是目录加载,只不过是通过FileTemplateLoader指定模板文件的根目录。

FileTemplateLoader

示例:使用文件加载方式调用resources/template/test.ftl模板输出网页。

Configuration configuration = new Configuration(Configuration.getVersion());
FileTemplateLoader fileTemplateLoader = new FileTemplateLoader(new File(System.getProperty("user.dir") + "/src/main/resources/template/"));
Template template;
Map data = new LinkedHashMap();
StringWriter stringWriter = new StringWriter();

configuration.setTemplateLoader(fileTemplateLoader);
template = configuration.getTemplate("test.ftl");

data.put("url", "https://tongfu.net/");

template.process(data, stringWriter);

return stringWriter.toString();

home/topic/2021/0418/20/e4289adefdaea7875afb52d05dc7657c.jpg

网址加载

网址加载就是通过一个远程的网址读取模板文件的内容,下载完成后再进行整合渲染的方式。

这种方式可以集中管理项目的模板文件,需要更改的时候只需要改一处就可以了。

URLTemplateLoader

由于这种加载方式需要搭建一个远程环境,所以福哥就偷个懒不提供示例代码了!

Webapp加载

Webapp加载就是通过ServletContext.getResource获得模板文件的内容。

WebappTemplateLoader

由于这种加载方式需要搭建一个发布环境,所以福哥就偷个懒不提供示例代码了!

复合加载

复合加载就是可以设置一堆加载器,FreeMarker会逐个尝试,失败一个就换下一个,直到成功一个,或者全部失败才会结束。

MultiTemplateLoader

示例:福哥设置了两个FileTemplateLoader加载器,第一个加载器下面没有test.ftl,第二个加载器下面有test.ftl。

Configuration configuration = new Configuration(Configuration.getVersion());
MultiTemplateLoader multiTemplateLoader = new MultiTemplateLoader(new TemplateLoader[]{
    new FileTemplateLoader(new File(System.getProperty("user.dir") + "/src/main/resources/abc/")),
    new FileTemplateLoader(new File(System.getProperty("user.dir") + "/src/main/resources/template/"))
});
Template template;
Map data = new LinkedHashMap();
StringWriter stringWriter = new StringWriter();

configuration.setTemplateLoader(multiTemplateLoader);
template = configuration.getTemplate("test.ftl");

data.put("url", "https://tongfu.net/");

template.process(data, stringWriter);

return stringWriter.toString();

home/topic/2021/0418/20/e4289adefdaea7875afb52d05dc7657c.jpg

总结

今天福哥带着童鞋们将Java的模板引擎FreeMarker的几种模板加载方式都学习了一遍,相信经过今天的课程大家在使用FreeMarker做项目的时候就会得心应手了~~