freemarker简单操作
简介:
FreeMarker 是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于 HTML
格式的文本用来自动生成源代码)的通用工具。它是为 Java 程序员提供的一个开发包或者说
是类库。它不是面向最终用户,而是为程序员提供的可以嵌入他们开发产品的一款应用程序。
FreeMarker 的设计实际上是被用来生成 HTML 网页,尤其是通过基于实现了 MVC(Model
View Controller,模型-视图-控制器)模式的 Servlet 应用程序。使用 MVC 模式的动态网页的构
思使得你可以将前端设计者(编写 HTML)从程序员中分离出来。所有人各司其职,发挥其擅
长的一面。网页设计师可以改写页面的显示效果而不受程序员编译代码的影响,因为应用程
序的逻辑(Java 程序)和页面设计(FreeMarker 模板)已经分开了。页面模板代码不会受到复杂
的程序代码影响。这种分离的思想即便对一个程序员和页面设计师是同一个人的项目来说都
是非常有用的,因为分离使得代码保持简洁而且便于维护。
尽管 FreeMarker 也有编程能力,但它也不是像 PHP 那样的一种全面的编程语言。反而,
Java 程序准备的数据来显示(比如 SQL 查询),FreeMarker 仅仅使用模板生成文本页面来呈现
已经准备好的数据。
依赖
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency>
例子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.zhao.codebuild; import freemarker.cache.FileTemplateLoader; import freemarker.cache.StringTemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template; import org.junit.Test; import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import java.io.StringReader; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 第一个FreeMarker程序(数据+模板=文件输出) * 1.操作步骤 */ public class freeMarkerTest { @Test public void test01() throws Exception { //1.创建FreeMarker的配置类 Configuration cfg = new Configuration(); //2.指定模板加载器:将模板存入缓存中 //文件路径加载器 FileTemplateLoader ftl = new FileTemplateLoader(new File("templates")); cfg.setTemplateLoader(ftl); //3.获取模板 Template template = cfg.getTemplate("template01.ftl"); //4.构造数据模型 Map<String,Object> dataModel = new HashMap<>(); // //user对象 dataModel.put("user","粒子"); dataModel.put("now", LocalDate.now()); dataModel.put("flag",1); dataModel.put("two","咿呀咿"); List<String> list = new ArrayList<>(); list.add("星期一"); list.add("星期二"); list.add("星期三"); list.add("星期四"); dataModel.put("weeks",list); //5.文件输出 /** * 处理模型 * 参数一:数据模型 * 参数二:writer(FileWriter(文件输出),printWriter(控制台输出)) */ template.process(dataModel,new FileWriter(new File(System.getProperty("user.dir")+"\\user.txt"))); //将数据打印到控制台的 template.process(dataModel,new PrintWriter(System.out)); } /** * 测试字符串模板 * * */ /** * com.${p1}.${p1}.${p1}.User * */ @Test public void test() throws Exception { //1.创建配置对象 Configuration cfg = new Configuration(); //2.指定加载器 cfg.setTemplateLoader(new StringTemplateLoader()); //3.创建字符串模板 // i.字符串 String templateString = "${user}使用了freemarker ${now} 。"; // ii.通过字符串创建模板 Template template = new Template("name1",new StringReader(templateString),cfg); //4.构造数据 Map<String,Object> dataModel = new HashMap<>(); dataModel.put("user","张三"); dataModel.put("now", LocalDateTime.now()); //5.处理模板 template.process(dataModel,new PrintWriter(System.out)); } }
需要的模板1
<#-- assign 指令 在ftl模板下存入数据到root节点下--> <#assign name="zhao"> ${user}使用了freemarker ${now} 。 <#--这是注释 freemarker 不会输出到文件中的--> <#-- if 语法--> <#if flag=0> 数据=0 <#elseif flag=1> 数据= 1 <#else > 数据=其他 </#if> <#-- list 语法 循环迭代用的 数组名称 as 别名 --> <#list weeks as w> ${w_index } ${w} </#list> <#-- include "路径名"--> <#include "template02.ftl"> ${name} <#-- 内置函数 使用方式 ?upper_case--> ${name?upper_case}
模板2
<#--模板2--> ${two}
代码地址:https://gitee.com/richOne/freemarkerAndMetaData/blob/master/codeBuild/src/test/java/com/zhao/codebuild/freeMarkerTest.java