Freemarker入门
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 Java、Html、Vue、 XML、JSP等。
以下演示以静态页面生成为例。
一、工程搭建
以一个简单的maven工程案例介绍Freemarker的使用
1). maven项目结构图
2). 导入Freemarker坐标 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lingting</groupId>
<artifactId>g_4_Freemarker</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.22</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
4). 其他准备
- 创建模板生成类
com.lingting.GenerateFromTemplate
- 创建生成文件夹
resources/pages
- 创建 模板文件
text.ftl
、head.ftl
二、模板语法
- 模板文件
test.ftl
(模板文件中引入了head.ftl
模板文件)
<html>
<#include "head.ftl">
<body>
<#-- 模板注释,不会被生成 -->
<!-- html注释,会被生成,不会被渲染 -->
${name},你好。${message}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以下语法写在此处
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
</body>
</html>
- test.ftl文件
<head>
<meta charset="utf-8"/>
<titile>Freemarker</titile>
</head>
模板文件中的四种元素
- 文本,直接输出的部分
- 注释,即
<#--...-->
格式不会输出 - 插值(Interpolation):即
${..}
部分,将使用数据模型中的部分替代输出 - FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。
1). FTL指令
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@ 指令 @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-- assign 指令:在页面上定义一个变量
<#assign linkman="邓女士">
联系人: ${linkman}
<#assign info={"mobile": "18199888899", "address": "大重庆"} >
电话:${info.mobile} 地址:${info.address}
-- include 指令:模板文件的嵌套: (见 head 头标签位置部分)
-- if 指令:在if判断中,可以使用 “=” ,也可以使用 “==”(推荐)
<#if success==true>
if ~~~~~~~~~~~~~~~
<#else >
else ~~~~~~~~~~~~~~
</#if>
<#if case == 1>
case = 1 ~~~~~~~~~~~~~
<#elseif case=2>
case == 2 ~~~~~~~~~~~~~
<#else>
case == ? ~~~~~~~~~~~~~
</#if>
-- list 指令:遍历【列表集合】,如果需要索引,使用 `循环变量 + "_index"` 语法!
<#assign list=[{"name":"晓庆","postiton":"goddess"},{"name":"成","postiton":"loser"}]>
<#list list as people>
${people_index + 1}: ${people.name} -- ${people.postiton}
</#list>
2). 内建函数
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@ 内建函数 @@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@ 内建函数 语法格式:“ 变量 + ? + 函数名称 ”
-- 获取某个集合大小
共 ${list?size} 条记录
-- 转换json字符串为对象
<#assign text = "{'bank': '工商','account': '123'}" />
<#assign data = text ? eval />
开户行:${data.bank} 账号:${data.account}
-- 日期格式化 (日期数据在 java 中准备)
当前日期:${today?date}
当前时间:${today?time}
当前日期+时间:${today?datetime}
日期格式化:${today?string("yyyy年MM月")}
-- 数字转化为字符串:数字打印会类似于 123,345,789 这种形式
累计积分:${point}
累计积分:${point?c}
3). 空值处理
如果不处理空值,很容易抛出异常,导致模板生成失败
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@ 空值处理 @@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@模板中使用了变量,但是代码中没有对变量赋值,为了防止抛错,可以对空值进行处理
-- 判断某变量是否存在:“variable??” : 存在返回true; 否则返回false
<#if aaa??>
aaa 存在
<#else >
aaa 不存在
</#if>
-- 缺失变量默认值 “!” (默认值的类型必须对应) : 使用 “!” 对 null 值做转换处理
${text!'-'}
${aaa!'!'}
4). 运算符注意事项
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@ 运算符 @@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , %
-- 逻辑运算符运算布尔值:&& || !
-- 比较运算符
<#--
1 =或者== :判断两个值是否相等.
2 != :判断两个值是否不等.
3 >或者gt :判断左边值是否大于右边值
4 >=或者gte :判断左边值是否大于等于右边值
5 <或者lt :判断左边值是否小于右边值
6 <=或者lte :判断左边值是否小于等于右边值
注意: =和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,
否则会产生错误,而且FreeMarker是精确比较,"x","x ","X"是不等的.其它的运行符可以作
用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,
因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>
-->
三、生成模板API
GenerateFromTemplate.java
package com.lingting;
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.Date;
public class GenerateFromTemplate {
public static void main(String[] args) throws Exception {
// 1. 创建配置类, 设置指定版本
Configuration configuration = new Configuration(Configuration.getVersion());
// 2. 设置模板所在的目录,案例演示,就生成在工作空间的项目下
configuration.setDirectoryForTemplateLoading(
new File(System.getProperty("user.dir") + "\\g_4_Freemarker\\src\\main\\resources")
);
// 3. 设置字符集
configuration.setDefaultEncoding("utf-8");
// 4. 加载模板
Template template = configuration.getTemplate("test.ftl");
// 5. 创建数据模型,可以使用pojo ,推荐使用Map。扩展性更好
// 如果数据添加的不全,在插入模板时会报错
Map map = new HashMap();
map.put("name", "晓庆");
map.put("message", "你好美!");
map.put("success", true);
map.put("case", 3);
map.put("today", new Date());
map.put("point", 123456789);
// 6. 创建Writer对象
Writer out = new FileWriter(new File(
System.getProperty("user.dir") + "\\g_4_Freemarker\\src\\main\\resources\\pages\\test.html"
));
// 7. 输出
template.process(map, out);
// 8. 释放系统资源
out.close();
}
}