FreeMarker的介绍和快速入门

admin2025-11-23 15:06:163769

一、了解FreeMarker

1. 什么是FreeMarker

FreeMarker是一个模板引擎,是一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最款程序员可以嵌入他们所开发产品的组件。

2. FreeMarker的工作机制

FreeMarker的工作机制

3. FreeMarker的官方文档

英文版:https://freemarker.apache.org/docs/

中文版:http://freemarker.foofun.cn/toc.html

4. FreeMarker的特点

彻底的分离表现层和业务逻辑

性能好,提高了开发效率

使得开发过程中的人员分工更加明确

学习成本低

支持表达式、宏定义(类似JSP标签)

二、FreeMarker的基本语法

1. 数据类型

标量:标量是最基本,最简单的数值类型

内容

说明

字符串

表示简单的文本

数字

整数和非整数是不区分的,只有单一的数字类型

布尔值

布尔值代表了逻辑上的对或错(是或否)

日期/时间(日期,时间或日期时间)

日期变量可以存储和日期/时间相关的数据

容器:这些值存在的目的是为了包含其他变量

内容

说明

哈希表

类似于Java中的HashMap,不记录内部元素的顺序,仅仅通过名称来访问数据

序列

类似于Java中的集合List,可以通过下标进行访问,从0开始

集合

从模板设计者角度来看,集合是有限制的序列,不能获取集合的大小,也不能通过索引取出集合中的子变量,但是它们仍然可以通过list指令来遍历

子程序

内容

方法和函数

用户自定义指令

2. 算术运算符

数字运算

运算符

例子

+

10+3= 13

-

10-3=7

*

10*3=30

/

10/3=3.333

%

10 %3=1

字符串运算

1.可以使用${..}在文本部分插入表达式的值,例如:${"Hello ${user}!"}

2.可以使用+操作符获得同样的结果:${"Hello " +user+ "!"}

3.${..}只能用于文本部分,下面的代码是错误的:<#if ${isBig}>Wow!应该写成:<#if isBig>Wow!

4.假设user的值为“zhangsan”:${user[O]]${user[4]}结果是:zg$[user[1..4]}结果是:hang

在线测试网站

https://try.freemarker.apache.org/

freemarker在线测试网站

3. 逻辑、比较运算符

逻辑运算符

符号

说明

&&

逻辑与

||

逻辑或

!

逻辑非

比较运算符

符号

说明

>(gt)

大于号,推荐使用gt

<(It)

小于号,推荐使用lt

>= (gte)

大于等于,推荐使用gte

<= (lte)

小于等于,推荐使用lte

==

等于

!=

不等于

1、只能比较数字和日期,不能比较字符串,返回为布尔类型不能直接输出

2、由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if (x >y)>

4. 空值运算符

?? :判断是否为空

这将检查对象的属性是否不为null:<#if object.attribute??>

这将检查对象或属性是否不为null:<#if (object.attribute)??>

! :指定缺失变量的默认值,如果不指定则默认值是空字符串、长度为0的序列或者长度为0的Map对象

${aaa!}:如果aaa变量没定义,不报错,默认没有任何输出

${aa!"-}:如果aaa变量没定义,为空的话,就默认设置该表达式的值为横杠,这里不会为aaa变量赋值 ${(user.name)!"默认值"}:如果user或name为null,就输出默认值。

$[user.name!"默认值"}:如果user为null会报错,如果name为null,就输出默认值

5. 模板中的代码片段

${...}: FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为interpolation(插值),FreeMarker中的运算也是在该大括号中进行;

注释:注释和HTML的注释也很相似,但是它们使用<#-- and -->来标识。不像HTML注释那样,FTL注释不会出现在输出中(不出现在访问者的页面中),因为FreeMarker会跳过它们。

FTL标签(FreeMarker Template Language):FTL标签和HTML标签有一些相似之处,但是它们是FreeMarker的指令,是不会在输出中打印的。这些标签的名字以#开头。(用户自定义的FTL标签则需要使用@来代替#)

6. 基本指令

可以直接点击以下指令查看以下指令的例子

中文解析

Alphabetical index

assign

attempt, recover

compress

escape, noescape

flush

ftl

function, return

global

if, else, elseif

import

include

list, else, items, sep, break

local

macro, nested, return

noparse

nt

setting

stop

switch, case, default, break

t, lt, rt

User-defined directive (<@...>)

visit, recurse, fallback

英文文档

Alphabetical index

assign

attempt, recover

autoesc

compress

escape, noescape (deprecated)

flush

ftl

function, return

global

if, else, elseif

import

include

list, else, items, sep, break, continue

local

macro, nested, return

noautoesc

noparse

nt

outputformat

setting

stop

switch, case, default, break

t, lt, rt

User-defined directive (<@...>)

visit, recurse, fallback

三、FreeMarker的快速入门

什么是页面静态化

静态网页:

a、静态网页的内容稳定,页面加载速度快。

b、静态网页的没有数据库支持,在网站制作和维护方面的工作量较大。

c、静态网页的交互性差,有很大的局限性。

动态网页:

a、交互性好。

b、动态网页的信息都需要从数据库中读取,每打开一个一面就需要去获取一次数据库,如果访问人数很多,也就会对服务器增加很大的荷载,从而影响这个网站的运行速度。

页面静态化适用场景

高并发、要求用户相应速度快

适用于大规模且数据变化不太频繁的页面

步骤

构建一个maven项目(使用默认模板)

导入FreeMarker的依赖(打开maven仓库去选择使用人数最多的版本)

org.freemarker

freemarker

2.3.31

在maven项目的resource目录卞构建一个templates的目录

在templates目录下构建一个welcome的ftl文件并且书写简单的模板内容

Insert title here

Hello,${name}

在src下新建一个package,并且书写加载ftl并且转换其他文件的类

step1、构建配置类

step2、设置模板存放路径

step3、构建数据模型

step4、加载模板文件

step5、生成Writer输出流

step6、输出文件

step7、关流

package freemarker;

import freemarker.template.Configuration;

import freemarker.template.Template;

import java.io.*;

import java.util.HashMap;

import java.util.Map;

/**

* @Author

*/

public class FreeMarker2Html {

//设置ftl的存放路径

private static final String TEMPLATE_PATH = "src\\main\\resources\\templates";

//设置生成文件的路径

private static final String CLASS_PATH = "src\\main\\resources\\templates";

public static void main(String[] args) {

// step1 创建freeMarker配置实例

Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);

configuration.setDefaultEncoding("utf‐8");

Writer out = null;

try {

// step2 获取模版路径

configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH));

// step3 创建数据模型

Map dataMap = new HashMap();

dataMap.put("name", "张三");

// step4 加载模版文件

Template template = configuration.getTemplate("welcome.ftl");

// step5 生成数据

File docFile = new File(CLASS_PATH + "\\" + "welcome.html");

out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));

// step6 输出文件

template.process(dataMap, out);

System.out.println("文件创建成功 !");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (null != out) {

out.close();

}

} catch (Exception e2) {

e2.printStackTrace();

}

}

}

}

此外还可以转换成JAVA代码,如将下面hello.ftl 转换成 HelloFreeMarker

模板的代码

package ${classPath};

public class ${className} {

public static void main(String[] args) {

System.out.println("${helloWorld}");

}

}

生成的代码

package templates;

public class HelloFreeMarker {

public static void main(String[] args) {

System.out.println("通过简单的 <代码自动生产程序> 演示 FreeMarker的HelloWorld!");

}

}

转换的代码

package freemarker;

import freemarker.template.Configuration;

import freemarker.template.Template;

import java.io.*;

import java.util.HashMap;

import java.util.Map;

/**

* @Author

*/

public class FreeMarker2Java {

//设置ftl的存放路径

private static final String TEMPLATE_PATH = "src\\main\\resources\\templates";

//设置生成文件的路径

private static final String CLASS_PATH = "src\\main\\java\\templates";

public static void main(String[] args) {

// step1 创建freeMarker配置实例

Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);

configuration.setDefaultEncoding("utf‐8");

Writer out = null;

try {

// step2 获取模版路径

configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH));

// step3 创建数据模型

Map dataMap = new HashMap();

dataMap.put("classPath", "templates");

dataMap.put("className", "HelloFremarker");

dataMap.put("helloWorld", "通过简单的 <代码自动生产程序> 演示 FreeMarker的HelloWorld!");

// step4 加载模版文件

Template template = configuration.getTemplate("hello.ftl");

// step5 生成数据

File docFile = new File(CLASS_PATH + "\\" + "HelloFremarker.java");

out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));

// step6 输出文件

template.process(dataMap, out);

System.out.println("文件创建成功 !");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (null != out) {

out.close();

}

} catch (Exception e2) {

e2.printStackTrace();

}

}

}

}

如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

搜索一下