一、了解FreeMarker
1. 什么是FreeMarker
FreeMarker是一个模板引擎,是一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最款程序员可以嵌入他们所开发产品的组件。
2. FreeMarker的工作机制
FreeMarker的工作机制3. FreeMarker的官方文档
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>
应该写成:<#if isBig>Wow!</#if>
4.假设user的值为“zhangsan”:${user[O]]${user[4]}
结果是:zg$[user[1..4]}
结果是:hang - freemarker在线测试网站
3. 逻辑、比较运算符
- 逻辑运算符
符号 | 说明 |
---|---|
&& | 逻辑与 |
|| | 逻辑或 |
! | 逻辑非 |
- 比较运算符
符号 | 说明 |
---|---|
>(gt) | 大于号,推荐使用gt |
<(It) | 小于号,推荐使用lt |
>= (gte) | 大于等于,推荐使用gte |
<= (lte) | 小于等于,推荐使用lte |
== | 等于 |
!= | 不等于 |
1、只能比较数字和日期,不能比较字符串,返回为布尔类型不能直接输出
2、由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if (x >y)>
4. 空值运算符
- ?? :判断是否为空
这将检查对象的属性是否不为null:<#if object.attribute??></#if>
这将检查对象或属性是否不为null:<#if (object.attribute)??></#if>
- ! :指定缺失变量的默认值,如果不指定则默认值是空字符串、长度为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仓库去选择使用人数最多的版本)
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
- 在maven项目的resource目录卞构建一个templates的目录
- 在templates目录下构建一个welcome的ftl文件并且书写简单的模板内容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Insert title here</title>
</head>
<body>
Hello,${name}
</body>
</html>
- 在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<String, Object> dataMap = new HashMap<String, Object>();
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<String, Object> dataMap = new HashMap<String, Object>();
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();
}
}
}
}
如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~
网友评论