Freemarker

1 介绍

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

image-20240221130438926

2 快速入门

  1. 引入依赖
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <!-- apache 对 java io 的封装工具库 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
</dependencies>
  1. 配置项
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
server:
  port: 8881 #服务端口
spring:
  application:
    name: test-freemarker #指定服务名
  freemarker:
    cache: false  #关闭模板缓存,方便测试
    settings:
      template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试
    suffix: .ftl               #指定Freemarker模板文件的后缀名
  1. 模板文件编写

在resources下创建templates,此目录为freemarker的默认模板存放目录。

在templates下创建模板文件example.ftl ,模板中的插值表达式最终会被freemarker替换成具体的数据。

注:freemarker模板文件通常都是以ftl作为扩展名,也可以为html、xml、jsp等

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Hello World!</title>
    </head>
    <body>
        <b>普通文本 String 展示:</b><br><br>
        Hello ${name} <br>
        <hr>
        <b>对象Student中的数据展示:</b><br/>
        姓名:${stu.name}<br/>
        年龄:${stu.age}
        <hr>
    </body>
</html>

freemarker作为springmvc一种视图格式,默认情况下SpringMVC支持freemarker视图格式。

  1. 搭建springbootweb工程,编写Controller
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
@Controller
public class ExampleController{
	@GetMapping("/example")
	public string example(Model model) {
        // name
        model.addAttribute("name","freemarker");
        //stu
        Student stu = new Student();
        stu.setName("姓名");
        stu.setAge("年龄");
        model.addAttribute("stu",stu);
		return "example"; // 由于配置文件中后缀为ftl,返回模板文件example.ftl
	}
}

启动项目后,返回填充后的模板。

3 Freemarker指令语法

基础语法种类

  1. 注释,即<#-- -->,介于其之间的内容会被freemarker忽略
<#--我是一个freemarker注释-->
  1. 插值(Interpolation):即${..}部分,freemarker会用真实的值代替${..}
Hello ${name}
  1. FTL指令:和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。
<# >FTL指令</#>
  1. 文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内容。
<#--freemarker中的普通文本-->
我是一个普通的文本

FTL指令

  1. 集合指令-List
<#list stus as stu>
	<tr>
		<td>${stu_index+1}</td>
		<td>${stu.name}</td>
		<td>${stu.age}</td>
		<td>${stu.money}</td>
	</tr>
</#list>

${k_index}:得到循环的下标,使用方法是在stu后边加"_index",它的值是从0开始

<#-- 获取map中的值方式1:map['keyname'].property -->
<#-- 获取map中的值方式2:map.keyname.property -->
<#list userMap?keys as key>
	key:${key}--value:${userMap["${key}"]}
</#list>
  1. 判断指令-If
<#if stu.name='小红'>
    <tr style="color: red">
        <td>${stu_index}</td>
        <td>${stu.name}</td>
        <td>${stu.age}</td>
        <td>${stu.money}</td>
    </tr>
<#else >
    <tr>
        <td>${stu_index}</td>
        <td>${stu.name}</td>
        <td>${stu.age}</td>
        <td>${stu.money}</td>
    </tr>
</#if>

在freemarker中,判断是否相等,=与==是一样的

运算符

  1. 算数运算符
加法: +
减法: -
乘法: *
除法: /
求模 (求余): %
  1. 比较运算符
比较运算符 说明
=或者== 判断两个值是否相等
!= 判断两个值是否不等
>或者gt 判断左边值是否大于右边值
>=或者gte 判断左边值是否大于等于右边值
<或者lt 判断左边值是否小于右边值
<=或者lte 判断左边值是否小于等于右边值
  1. 逻辑运算符
逻辑与:&& 
逻辑或:|| 
逻辑非:! 

空值处理

  1. 判断某变量是否存在使用 ??
<#if stus??>  <#-- 防止stus为空报错 -->
	<#list stus as stu>
	......
	</#list>
</#if>
  1. 缺失变量默认值使用 !

缺失变量默认值使用 “!”

使用!要以指定一个默认值,当变量为空时显示默认值

例:${name!’’}表示如果name为空显示空字符串。‘‘为两个单引号。

如果是嵌套对象则建议使用()括起来

例:${(stu.name)!’’}表示,如果stu或name为空默认显示空字符串。

内建函数

  1. 集合的大小
${集合名?size}
  1. 日期格式化
显示年月日: ${today?date}
显示时分秒:${today?time}
显示日期+时间:${today?datetime}
自定义格式化:${today?string("yyyy年MM月")}
  1. 转字符串
${point?c}
  1. json转对象
<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
<#assign data=text?eval />
开户行:${data.bank}  账号:${data.account}

4 静态输出文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class demo{
    @Autowired
	private Configuration configuration;
	
	public void test()throws IException, TemplateException{
        Template template= configuration.getTemplate("example.ftl");

		/**两个参数
		*第一个参数:模型数据
		*第二个参数:输出流*/
    	template.process(getData(), new FileWriter("d:/demo.html"));
    }
}
updatedupdated2024-02-232024-02-23