目錄
前言
在項目需要實現靜態化頁面,拿到專業的前端人員定義好的模板,就可以開工咯,爲什麼要使用 Freemarker 框架來做靜態化,嗯!這個問題就不在這兒討論,本片博客主要介紹了Java模板引擎Freemarker2.x進階指南。
Java模板引擎Freemarker2.x進階詳情
一、關於靜態化頁面
什麼是網頁靜態化:通過一些技術手段 Freemarker 或者 Thymeleaf 將動態頁面JSP、asp.net、php 等轉換成靜態的頁面,通過瀏覽器直接訪問現成的靜態頁面。
二、網頁靜態化特點
1、通過瀏覽器直接訪問靜態的頁面,不需要經過程序處理,它的訪問速度高;
2、穩定性好;
3、更有效的防止安全漏洞問題,比如不易遭受黑客攻擊;
4、靜態的頁面更容易被搜索引擎收錄;
三、關於Freemarker
FreeMarker 是一個用Java語言編寫的模板引擎,它基於模板輸出文本。FreeMarker 與 Web 容器無關,即在Web運行時,它並不知道 Servlet 或 HTTP。它不僅可以用作表現層的實現技術,而且還可以用於生成XML,JSP或Java 等。
FreeMarker Template Language (FTL)。 在模板中,你可以專注於如何展現數據, 而在模板之外可以專注於要展示什麼數據。 這種方式通常被稱爲 MVC (模型 視圖 控制器) 模式,對於動態網頁來說,是一種特別流行的模式。
FreeMarker 的設計實際上是被用來生成 HTML 網頁,尤其是通過基於實現了 MVC(Model View Controller,模型-視圖-控制器)模式的 Servlet 應用程序。使用 MVC 模式的動態網頁的構思使得你可以將前端設計者(編寫 HTML)從程序員中分離出來。所有人各司其職,發揮其擅長的一面。網頁設計師可以改寫頁面的顯示效果而不受程序員編譯代碼的影響,因爲應用程序的邏輯(Java 程序)和頁面設計(FreeMarker 模板)已經分開了。頁面模板代碼不會受到複雜的程序代碼影響。這種分離的思想即便對一個程序員和頁面設計師是同一個人的項目來說都是非常有用的,因爲分離使得代碼保持簡潔而且便於維護。
儘管 FreeMarker 也有編程能力,但它也不是像 PHP 那樣的一種全面的編程語言。反而,Java 程序準備的數據來顯示(比如 SQL 查詢),FreeMarker 僅僅使用模板生成文本頁面來呈現已經準備好的數據。
目前企業中主要用Freemarker做靜態頁面或是頁面展示,所以在本篇博客,博主主要使用Freemarker來做靜態化示例。
四、Freemarker 的使用步驟
1)、創建一個Configuration對象,直接new一個對象。構造方法的參數就是freemarker對於的版本號;
2)、設置模板文件所在的路徑;
3)、設置模板文件使用的字符集。一般就是UTF-8;
4)、加載一個模板,創建一個模板對象;
5)、創建一個模板使用的數據集,可以是pojo也可以是map。一般是Map;
6)、創建一個Writer對象,一般創建一FileWriter對象,指定生成的文件名;
7)、調用模板對象的process方法輸出文件;
8)、關閉流;
代碼示例如下:
package com.huazai.freemarker.test;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
*
* @author HuaZai
* @contact [email protected]
* <ul>
* @description 通過模板技術實現靜態網頁的輸出
* </ul>
* @className TGenerateHtml
* @package com.huazai.freemarker.test
* @createdTime 2017年06月17日
*
* @version V1.0.0
*/
public class TGenerateHtml
{
@Test
public void GenHtml() throws Exception
{
// 1、創建個Configuration對象
Configuration configuration = new Configuration(Configuration.getVersion());
String diretoryp_ath = "模板文件所在的路徑的目錄";
// 2、設置模板文件所在的路徑的目錄
configuration.setDirectoryForTemplateLoading(new File(diretoryp_ath));
// 3、設置模板文件的字符集
configuration.setDefaultEncoding("UTF-8");
// 4、首先創建模板文件,再加載模板文件 模板文件的後綴官方統一的標準是.ftl 其實任何類型都行。
Template template = configuration.getTemplate("template.htm");// 可以是<相對路徑>,也可以是<絕對路徑>
// 5、創建模板文件需要展示數據的數據集對象,可以使用POJO,也可以使用map 一般是使用map
Map<String, String> model = new HashMap<>();
model.put("hello", "hello");
String pre_file_path = "生成的靜態文件的文件路徑";
// 6、創建一個FileWriter對象 指定生成的靜態文件的文件路徑及文件名
// 拼接一個前綴和後綴
FileWriter writer = new FileWriter(new File(pre_file_path + "/result.html"));
// 7、調用模板對象的process方法,執行輸出文件。
template.process(model, writer);
// 8、關閉流
writer.close();
}
}
五、Freemarker 的使用
1)、新建Maven工程
2)、引入 Maven 依賴,在項目的pom.xml配置文件中添加 freemarker 依賴包
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
3)、新建一個數據載體 EmployeeDTO
package com.huazai.freemarker.dto;
/**
*
* @author HuaZai
* @contact [email protected]
* <ul>
* @description 員工實體
* </ul>
* @className Employee
* @package com.huazai.freemarker.pojo
* @createdTime 2017年06月18日
*
* @version V1.0.0
*/
public class EmployeeDTO
{
/**
* 員工ID
*/
private String empId;
/**
* 員工姓名
*/
private String empName;
public String getEmpId()
{
return empId;
}
public void setEmpId(String empId)
{
this.empId = empId;
}
public String getEmpName()
{
return empName;
}
public void setEmpName(String empName)
{
this.empName = empName;
}
@Override
public String toString()
{
return "Employee [empId=" + empId + ", empName=" + empName + "]";
}
public EmployeeDTO()
{
super();
}
public EmployeeDTO(String empId, String empName)
{
super();
this.empId = empId;
this.empName = empName;
}
}
六、Freemarker 常用語法
1)、通過模板技術實現靜態網頁的輸出<訪問Map中的key屬性>
package com.huazai.freemarker.test;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
*
* @author HuaZai
* @contact [email protected]
* <ul>
* @description 通過模板技術實現靜態網頁的輸出<訪問Map中的key屬性>
* <li>--訪問Map中的key屬性<br>
* <li>${hello}
* </ul>
* @className TGenerateHtml
* @package com.huazai.freemarker.test
* @createdTime 2017年06月17日
*
* @version V1.0.0
*/
public class TKeyHtml
{
@Test
public void GenHtml() throws Exception
{
// 1、創建個Configuration對象
Configuration configuration = new Configuration(Configuration.getVersion());
String diretoryp_ath = "D:\\fremarker";
// 2、設置模板文件所在的路徑的目錄
configuration.setDirectoryForTemplateLoading(new File(diretoryp_ath));
// 3、設置模板文件的字符集
configuration.setDefaultEncoding("UTF-8");
// 4、首先創建模板文件,再加載模板文件 模板文件的後綴官方統一的標準是.ftl 其實任何類型都行。
Template template = configuration.getTemplate("template.ftl");// 可以是<相對路徑>,也可以是<絕對路徑>
// 5、創建模板文件需要展示數據的數據集對象,可以使用POJO,也可以使用map 一般是使用map
Map<String, String> model = new HashMap<>();
model.put("hello", "hello world!");
String pre_file_path = "D:\\fremarker";
// 6、創建一個FileWriter對象 指定生成的靜態文件的文件路徑及文件名
// 拼接一個前綴和後綴
FileWriter writer = new FileWriter(new File(pre_file_path + "/result.html"));
// 7、調用模板對象的process方法,執行輸出文件。
template.process(model, writer);
// 8、關閉流
writer.close();
}
}
模板內容:
--訪問Map中的key屬性<br>
${hello}
效果圖如下:
2)、通過模板技術實現靜態網頁的輸出<訪問POJO中的屬性>
package com.huazai.freemarker.test;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import com.huazai.freemarker.dto.EmployeeDTO;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
*
* @author HuaZai
* @contact [email protected]
* <ul>
* @description 通過模板技術實現靜態網頁的輸出<訪問POJO中的屬性>
* <li>-- 訪問POJO中的屬性<br>
* <li>${employee.empId}
* <li>${employee.empName}
* </ul>
* @className TPojoHtml
* @package com.huazai.freemarker.test
* @createdTime 2017年06月17日
*
* @version V1.0.0
*/
public class TPojoHtml
{
@Test
public void GenHtml() throws Exception
{
// 1、創建個Configuration對象
Configuration configuration = new Configuration(Configuration.getVersion());
String diretoryp_ath = "D:\\fremarker";
// 2、設置模板文件所在的路徑的目錄
configuration.setDirectoryForTemplateLoading(new File(diretoryp_ath));
// 3、設置模板文件的字符集
configuration.setDefaultEncoding("UTF-8");
// 4、首先創建模板文件,再加載模板文件 模板文件的後綴官方統一的標準是.ftl 其實任何類型都行。
Template template = configuration.getTemplate("template.ftl");// 可以是<相對路徑>,也可以是<絕對路徑>
// 5、創建模板文件需要展示數據的數據集對象,可以使用POJO,也可以使用map 一般是使用map
Map<String, Object> model = new HashMap<>();
model.put("employee", new EmployeeDTO("001", "huazai"));
String pre_file_path = "D:\\fremarker";
// 6、創建一個FileWriter對象 指定生成的靜態文件的文件路徑及文件名
// 拼接一個前綴和後綴
FileWriter writer = new FileWriter(new File(pre_file_path + "/result.html"));
// 7、調用模板對象的process方法,執行輸出文件。
template.process(model, writer);
// 8、關閉流
writer.close();
}
}
模板內容:
-- 訪問POJO中的屬性<br>
${employee.empId}
${employee.empName}
效果圖如下:
3)、通過模板技術實現靜態網頁的輸出<訪問集合中的數據>
package com.huazai.freemarker.test;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import com.huazai.freemarker.dto.EmployeeDTO;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
*
* @author HuaZai
* @contact [email protected]
* <ul>
* @description 通過模板技術實現靜態網頁的輸出<訪問集合中的數據>
* <li>-- 訪問集合中的數據<br>
* <li><#list list as item>
* <li> ${item_index}
* <li> ${item.empId}
* <li> ${item.empName}<br>
* <li></#list>
* <li>
* <li>-- 邏輯判斷語句<br>
* <li><#list list as item>
* <li> <#if item_index%2==0>
* <li> 這是偶數行》
* <li> <#else>
* <li> 這是奇數行》
* <li> </#if>
* <li> ${item_index}
* <li> ${item.empId}
* <li> ${item.empName}<br>
* <li></#list>
* </ul>
* @className TArrayHtml
* @package com.huazai.freemarker.test
* @createdTime 2017年06月17日
*
* @version V1.0.0
*/
public class TArrayHtml
{
@Test
public void GenHtml() throws Exception
{
// 1、創建個Configuration對象
Configuration configuration = new Configuration(Configuration.getVersion());
String diretoryp_ath = "D:\\fremarker";
// 2、設置模板文件所在的路徑的目錄
configuration.setDirectoryForTemplateLoading(new File(diretoryp_ath));
// 3、設置模板文件的字符集
configuration.setDefaultEncoding("UTF-8");
// 4、首先創建模板文件,再加載模板文件 模板文件的後綴官方統一的標準是.ftl 其實任何類型都行。
Template template = configuration.getTemplate("template.ftl");// 可以是<相對路徑>,也可以是<絕對路徑>
// 5、創建模板文件需要展示數據的數據集對象,可以使用POJO,也可以使用map 一般是使用map
Map<String, Object> model = new HashMap<>();
List<EmployeeDTO> employeeDTOs = new ArrayList<EmployeeDTO>();
employeeDTOs.add(new EmployeeDTO("1001", "冰心"));
employeeDTOs.add(new EmployeeDTO("1002", "季羨林"));
employeeDTOs.add(new EmployeeDTO("1003", "汪曾祺"));
model.put("list", employeeDTOs);
String pre_file_path = "D:\\fremarker";
// 6、創建一個FileWriter對象 指定生成的靜態文件的文件路徑及文件名
// 拼接一個前綴和後綴
FileWriter writer = new FileWriter(new File(pre_file_path + "/result.html"));
// 7、調用模板對象的process方法,執行輸出文件。
template.process(model, writer);
// 8、關閉流
writer.close();
}
}
模板內容:
-- 訪問集合中的數據<br>
<#list list as item>
${item_index}
${item.empId}
${item.empName}<br>
</#list>
效果圖如下:
4)、通過模板技術實現靜態網頁的輸出<訪問map集合中的數據>
package com.huazai.freemarker.test;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import com.huazai.freemarker.dto.EmployeeDTO;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
*
* @author HuaZai
* @contact [email protected]
* <ul>
* @description 通過模板技術實現靜態網頁的輸出<訪問map集合中的數據>
* <li>-- 訪問map集合中的數據<br>
* <li><#list map?keys as key>
* <li> ${map[key].empId}
* <li> ${map[key].empName}<br>
* <li></#list>
* </ul>
* @className TMapHtml
* @package com.huazai.freemarker.test
* @createdTime 2017年06月17日
*
* @version V1.0.0
*/
public class TMapHtml
{
@Test
public void GenHtml() throws Exception
{
// 1、創建個Configuration對象
Configuration configuration = new Configuration(Configuration.getVersion());
String diretoryp_ath = "D:\\fremarker";
// 2、設置模板文件所在的路徑的目錄
configuration.setDirectoryForTemplateLoading(new File(diretoryp_ath));
// 3、設置模板文件的字符集
configuration.setDefaultEncoding("UTF-8");
// 4、首先創建模板文件,再加載模板文件 模板文件的後綴官方統一的標準是.ftl 其實任何類型都行。
Template template = configuration.getTemplate("template.ftl");// 可以是<相對路徑>,也可以是<絕對路徑>
// 5、創建模板文件需要展示數據的數據集對象,可以使用POJO,也可以使用map 一般是使用map
Map<String, Object> model = new HashMap<>();
Map<String, Object> map = new HashMap<>();
map.put("m1", new EmployeeDTO("1001", "冰心"));
map.put("m2", new EmployeeDTO("1002", "季羨林"));
map.put("m3", new EmployeeDTO("1003", "汪曾祺"));
model.put("map", map);
String pre_file_path = "D:\\fremarker";
// 6、創建一個FileWriter對象 指定生成的靜態文件的文件路徑及文件名
// 拼接一個前綴和後綴
FileWriter writer = new FileWriter(new File(pre_file_path + "/result.html"));
// 7、調用模板對象的process方法,執行輸出文件。
template.process(model, writer);
// 8、關閉流
writer.close();
}
}
模板內容:
-- 訪問map集合中的數據<br>
<#list map?keys as key>
${map[key].empId}
${map[key].empName}<br>
</#list>
效果圖如下:
5)、通過模板技術實現靜態網頁的輸出<日期類型格式化>
package com.huazai.freemarker.test;
import java.io.File;
import java.io.FileWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
*
* @author HuaZai
* @contact [email protected]
* <ul>
* @description 通過模板技術實現靜態網頁的輸出<日期類型格式化>
* <li>-- 日期類型格式化<br>
* <li>當前日期:${date?date}<br>
* <li>當前時間:${date?time}<br>
* <li>當前日期和時間:${date?datetime}<br>
* <li>自定義日期格式:${date?string("yyyy年MM月dd日 HH時mm分ss秒")}<br>
* </ul>
* @className TDateHtml
* @package com.huazai.freemarker.test
* @createdTime 2017年06月17日
*
* @version V1.0.0
*/
public class TDateHtml
{
@Test
public void GenHtml() throws Exception
{
// 1、創建個Configuration對象
Configuration configuration = new Configuration(Configuration.getVersion());
String diretoryp_ath = "D:\\fremarker";
// 2、設置模板文件所在的路徑的目錄
configuration.setDirectoryForTemplateLoading(new File(diretoryp_ath));
// 3、設置模板文件的字符集
configuration.setDefaultEncoding("UTF-8");
// 4、首先創建模板文件,再加載模板文件 模板文件的後綴官方統一的標準是.ftl 其實任何類型都行。
Template template = configuration.getTemplate("template.ftl");// 可以是<相對路徑>,也可以是<絕對路徑>
// 5、創建模板文件需要展示數據的數據集對象,可以使用POJO,也可以使用map 一般是使用map
Map<String, Object> model = new HashMap<>();
model.put("date", new Date());
String pre_file_path = "D:\\fremarker";
// 6、創建一個FileWriter對象 指定生成的靜態文件的文件路徑及文件名
// 拼接一個前綴和後綴
FileWriter writer = new FileWriter(new File(pre_file_path + "/result.html"));
// 7、調用模板對象的process方法,執行輸出文件。
template.process(model, writer);
// 8、關閉流
writer.close();
}
}
模板內容:
-- 日期類型格式化<br>
當前日期:${date?date}<br>
當前時間:${date?time}<br>
當前日期和時間:${date?datetime}<br>
自定義日期格式:${date?string("yyyy年MM月dd日 HH時mm分ss秒")}<br>
效果圖如下:
6)、通過模板技術實現靜態網頁的輸出<非空判斷 + 框架標籤>
package com.huazai.freemarker.test;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
*
* @author HuaZai
* @contact [email protected]
* <ul>
* @description 通過模板技術實現靜態網頁的輸出<非空判斷 + 框架標籤>
* <li>-- 非空判斷 + 框架標籤<br>
* <li>空值處理:${list!"這個是空值"}<br>
* <li>引用頁面01:<#include "page_01.htm"><br>
* <li>引用頁面02:<#include "page_02.htm"><br>
* <li>引用頁面03:<#include "page_03.htm"><br>
* </ul>
* @className TRestHtml
* @package com.huazai.freemarker.test
* @createdTime 2017年06月17日
*
* @version V1.0.0
*/
public class TRestHtml
{
@Test
public void GenHtml() throws Exception
{
// 1、創建個Configuration對象
Configuration configuration = new Configuration(Configuration.getVersion());
String diretoryp_ath = "D:\\fremarker";
// 2、設置模板文件所在的路徑的目錄
configuration.setDirectoryForTemplateLoading(new File(diretoryp_ath));
// 3、設置模板文件的字符集
configuration.setDefaultEncoding("UTF-8");
// 4、首先創建模板文件,再加載模板文件 模板文件的後綴官方統一的標準是.ftl 其實任何類型都行。
Template template = configuration.getTemplate("template.ftl");// 可以是<相對路徑>,也可以是<絕對路徑>
// 5、創建模板文件需要展示數據的數據集對象,可以使用POJO,也可以使用map 一般是使用map
Map<String, Object> model = new HashMap<>();
model.put("list", null);
model.put("page_01_name", "這是01號頁面");
model.put("page_02_name", "這是02號頁面");
model.put("page_03_name", "這是03號頁面");
String pre_file_path = "D:\\fremarker";
// 6、創建一個FileWriter對象 指定生成的靜態文件的文件路徑及文件名
// 拼接一個前綴和後綴
FileWriter writer = new FileWriter(new File(pre_file_path + "/result.html"));
// 7、調用模板對象的process方法,執行輸出文件。
template.process(model, writer);
// 8、關閉流
writer.close();
}
}
模板內容:
-- 非空判斷 + 框架標籤<br>
空值處理:${list!"這個是空值"}<br>
引用頁面01:<#include "page_01.ftl"><br>
引用頁面02:<#include "page_02.ftl"><br>
引用頁面03:<#include "page_03.ftl"><br>
效果圖如下:
涉及多頁面,省略此圖!!!
七、相關文檔
Freemarker 中文版本文檔:【Freemarker使用指南_中文版文檔】
GitHub示例源碼地址:【Java模板引擎Freemarker2.x進階指南】
好了,關於 Java模板引擎Freemarker2.x進階指南 就寫到這兒了,如果還有什麼疑問或遇到什麼問題歡迎掃碼提問,也可以給我留言哦,我會一一詳細的解答的。
歇後語:“ 共同學習,共同進步 ”,也希望大家多多關注CSND的IT社區。
作 者: | 華 仔 |
聯繫作者: | [email protected] |
來 源: | CSDN (Chinese Software Developer Network) |
原 文: | https://blog.csdn.net/Hello_World_QWP/article/details/103805984 |
版權聲明: | 本文爲博主原創文章,請在轉載時務必註明博文出處! |