介绍
介绍
上一课福哥带着大家学习了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();
文件加载
这里虽然说的是文件加载,但其实就是目录加载,只不过是通过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();
网址加载
网址加载就是通过一个远程的网址读取模板文件的内容,下载完成后再进行整合渲染的方式。
这种方式可以集中管理项目的模板文件,需要更改的时候只需要改一处就可以了。
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();
总结
今天福哥带着童鞋们将Java的模板引擎FreeMarker的几种模板加载方式都学习了一遍,相信经过今天的课程大家在使用FreeMarker做项目的时候就会得心应手了~~