Freemarker概述
FreeMarker 是一款 模板引擎: 即一種基于模板和要改變的數據, 并用來生成輸出文本(HTML網頁,電子郵件,配置文件,源代碼等)的通用工具。 它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。
環境搭建
- 工程依賴
<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><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- apache 對 java io 的封裝工具庫 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>1.3.2</version></dependency></dependencies>
- application.yml配置文件
server:port: 8881 #服務端口
spring:application:name: freemarker-demo #指定服務名freemarker:cache: false #關閉模板緩存,方便測試settings:template_update_delay: 0 #檢查模板更新延遲時間,設置為0表示立即檢查,如果時間大于0會有緩存不方便進行模板測試suffix: .ftl #指定Freemarker模板文件的后綴名
在resources\templates\目錄下創建01-basic.ftl文件
<!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>
創建控制器
package com.heima.freemarker.controller;import com.heima.freemarker.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class HelloController {@GetMapping("/basic")public String hello(Model model){model.addAttribute("name","freemarker");Student student = new Student();student.setName("小明");student.setAge(18);model.addAttribute("stu",student);return "01-basic";}
}
Freemarker指令語法
基礎語法
- 注釋:<#-- -->
- 插值:${…}部分,freemarker會用真實的值代替${…}
- FTL(FreeMarker Template Language)指令:<# >FTL指令</#>
- 文本:不加任何標記會被直接輸出
FTL指令
- 集合指令-List:<#list></#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>
上面的stus是model中的一個列表屬性。
- 集合指令-Map
輸出stu1的學生信息:<br/>
姓名:${stuMap['stu1'].name}<br/>
年齡:${stuMap['stu1'].age}<br/>
<br/>
<a href="###">方式二:通過map.keyname.property</a><br/>
輸出stu2的學生信息:<br/>
姓名:${stuMap.stu2.name}<br/>
年齡:${stuMap.stu2.age}<br/><br/>
變量map
<#list stuMap?keys as key><tr><td>${key_index+1}</td><td>${stuMap[key].name}</td><td>${stuMap[key].age}</td><td>${stuMap[key].money}</td></tr></#list>
- if指令
<#if expression>
<#else>
</#if>
在freemarker中,判斷是否相等,=與==號等價
空值處理
- 判斷某變量是否存在使用“??”
用法為:variable??,如果該變量存在,返回true,否則返回false
<#if stus??><#list stus as stu></#list>
</#if>
- 缺失變量默認使用"!"
列如,${name!‘’}表示如果name為空顯示空字符串
內建函數
內建函數語法格式:變量+?+函數名稱
- stus集合的大小:${stus?size}
- 日期格式化:
3. 將json字符串轉為對象
<#assign text="{'bank':'工商銀行','account': '102313213123'}">
<#assign data=text?eval/>
開戶行:${data.bank} 賬號:${data.account}
輸出靜態化文件
實現思路
使用freemarker原生Api將頁面生成html文件
@SpringBootTest(classes = FreemarkerDemoApplication.class)
@RunWith(SpringRunner.class)
public class FreemarkerTest {@Autowiredprivate Configuration configuration;@Testpublic void test() throws IOException, TemplateException {Template template = configuration.getTemplate("02-list.ftl");/*** 合成方法*/template.process(getData(),new FileWriter("g:/list.html"));}private Map getData(){Map<String,Object> map = new HashMap<>();//------------------------------------Student stu1 = new Student();stu1.setName("小強");stu1.setAge(18);stu1.setMoney(1000.86f);stu1.setBirthday(new Date());//小紅對象模型數據Student stu2 = new Student();stu2.setName("小紅");stu2.setMoney(200.1f);stu2.setAge(19);//將兩個對象模型數據存放到List集合中List<Student> stus = new ArrayList<>();stus.add(stu1);stus.add(stu2);//向model中存放List集合數據map.put("stus",stus);//------------------------------------//創建Map數據HashMap<String,Student> stuMap = new HashMap<>();stuMap.put("stu1",stu1);stuMap.put("stu2",stu2);// 3.1 向model中存放Map數據map.put("stuMap", stuMap);return map;}
}