1. 介绍
1.1 介绍
上一课福哥带着大家学习了Java的FreeMarker模板引擎的使用技巧,其实FreeMarker除了可以通过指定模板根目录的方式加载模板外,还有非常多的个性化的模板加载方式,在不同的场合下使用适合的加载方式会让我们编写代码更加方便,同时运行效率也会更高。
FreeMarker支持的模板加载方式包括字符串加载(StringTemplateLoader)、类加载(ClassTemplateLoader)、文件加载(FileTemplateLoader)、网址加载(URLTemplateLoader)、Webapp加载(WebappTemplateLoader)以及复合加载(MultiTemplateLoader)这么多种方式,今天福哥就带着大家一一学习一下。
2. 目录加载
这是最简单也最直观的方式,上一课福哥给大家讲解的教程就是采用这种方式。
首先通过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");
3. 字符串加载
这种方式就是通过字符串描绘模板文件内容的方式,比较适用于简单的页面的情况,例如:错误提示页面、跳转中转页面等等。
3.1 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();
4. 类加载
类加载方式就是指定一个类,这个类的定义文件所在的目录就是模板文件的根目录,这样的好处是可以将模板文件分散开来部署,避免集中部署带来的冲突问题。
4.1 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();
5. 文件加载
这里虽然说的是文件加载,但其实就是目录加载,只不过是通过FileTemplateLoader指定模板文件的根目录。
5.1 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();
6. 网址加载
网址加载就是通过一个远程的网址读取模板文件的内容,下载完成后再进行整合渲染的方式。
这种方式可以集中管理项目的模板文件,需要更改的时候只需要改一处就可以了。
6.1 URLTemplateLoader
由于这种加载方式需要搭建一个远程环境,所以福哥就偷个懒不提供示例代码了!
7. Webapp加载
Webapp加载就是通过ServletContext.getResource获得模板文件的内容。
7.1 WebappTemplateLoader
由于这种加载方式需要搭建一个发布环境,所以福哥就偷个懒不提供示例代码了!
8. 复合加载
复合加载就是可以设置一堆加载器,FreeMarker会逐个尝试,失败一个就换下一个,直到成功一个,或者全部失败才会结束。
8.1 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();
9. 总结
今天福哥带着童鞋们将Java的模板引擎FreeMarker的几种模板加载方式都学习了一遍,相信经过今天的课程大家在使用FreeMarker做项目的时候就会得心应手了~~