1. 介绍
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
模板 + 数据模型 = 输出
官网
http://try.freemarker.org/
2. 使用
程序开发指南
参考以下文章,侵删致歉:
FreeMarker 快速入门
1. 导入jar包
Installing FreeMarker
建立Maven项目,在pom.xml
文件中添加依赖。
1 2 3 4 5 6 7
| <dependencies> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency> </dependencies>
|
2. 创建运行模板引擎的Java文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.*;
import freemarker.template.Configuration; import freemarker.template.Template;
public class FreemarkerDemo {
private static final String TEMPLATE_PATH = "src/main/resources"; private static final String CLASS_PATH = "src/main/java";
public static void main(String[] args) { Configuration configuration = new Configuration(); Writer out = null; try { configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH)); Map<String, Object> dataMap = new HashMap<String, Object>(); dataMap.put("classPath", "com.freemark.hello"); dataMap.put("className", "AutoCodeDemo"); dataMap.put("helloWorld", "通过简单的 <代码自动生产程序> 演示 FreeMarker的HelloWorld!"); Template template = configuration.getTemplate("hello.ftl"); File docFile = new File(CLASS_PATH + "/" + "AutoCodeDemo.txt"); out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile))); template.process(dataMap, out); System.out.println("AutoCodeDemo.txt 文件创建成功 !"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != out) { out.flush(); } } catch (Exception e2) { e2.printStackTrace(); } } }
}
|
3. 创建模板引擎
在hello.ftl
文件中编写
1 2 3 4 5 6 7 8 9
| package ${classPath};
public class ${className} {
public static void main(String[] args) { System.out.println("${helloWorld}"); }
}
|
4. 运行项目
会自动输出文件
3. 语法
模板一览
宏 自定义指令
变量
表达式
FreeMarker一篇通
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| 摘自[FreeMarker 快速入门](https://segmentfault.com/a/1190000011768799) 字符串输出: ${"Hello ${name} !"} / ${"Hello " + name + " !"} <#assign cname=r"特殊字符完成输出(http:\www.baidu.com)"> ${cname}
字符串截取 : 通过下标直接获取下标对应的字母: ${name[2]} 起点下标..结尾下标截取字符串:${name[0..5]}
算数运算: <#-- 支持"+"、"-"、"*"、"/"、"%"运算符 --> <#assign number1 = 10> <#assign number2 = 5> "+" : ${number1 + number2} "-" : ${number1 - number2} "*" : ${number1 * number2} "/" : ${number1 / number2} "%" : ${number1 % number2}
比较运算符: <#if number1 + number2 gte 12 || number1 - number2 lt 6> "*" : ${number1 * number2} <#else> "/" : ${number1 / number2} </#if>
内建函数: <#assign data = "abcd1234"> 第一个字母大写:${data?cap_first} 所有字母小写:${data?lower_case} 所有字母大写:${data?upper_case} <#assign floatData = 12.34> 数值取整数:${floatData?int} 获取集合的长度:${users?size} 时间格式化:${dateTime?string("yyyy-MM-dd")}
空判断和对象集合: <#if users??> <#list users as user > ${user.id} - ${user.name} </#list> <#else> ${user!"变量为空则给一个默认值"} </#if>
Map集合: <#assign mapData={"name":"程序员", "salary":15000}> 直接通过Key获取 Value值:${mapData["name"]} 通过Key遍历Map: <#list mapData?keys as key> Key: ${key} - Value: ${mapData[key]} </#list> 通过Value遍历Map: <#list mapData?values as value> Value: ${value} </#list>
List集合: <#assign listData=["ITDragon", "blog", "is", "cool"]> <#list listData as value>${value} </#list>
include指令: 引入其他文件:<#include "otherFreeMarker.ftl" />
macro宏指令: <#macro mo> 定义无参数的宏macro--${name} </#macro> 使用宏macro: <@mo /> <#macro moArgs a b c> 定义带参数的宏macro-- ${a+b+c} </#macro> 使用带参数的宏macro: <@moArgs a=1 b=2 c=3 />
命名空间: <#import "otherFreeMarker.ftl" as otherFtl> ${otherFtl.otherName} <@otherFtl.addMethod a=10 b=20 /> <#assign otherName="修改otherFreeMarker.ftl中的otherName变量值"/> ${otherFtl.otherName} <#assign otherName="修改otherFreeMarker.ftl中的otherName变量值" in otherFtl /> ${otherFtl.otherName}
|
maven编译运行
1 2 3
| mvn package cd target java -jar xxx.jar /Users/xxx/businessModel.json(main函数参数一) /Users/xxx/testOutput(main函数参数二)
|