SpringBoot2 整合FreeMarker實(shí)現(xiàn)頁(yè)面靜態(tài)化示例詳解
一、頁(yè)面靜態(tài)化
1、動(dòng)靜態(tài)頁(yè)面
靜態(tài)頁(yè)面
即靜態(tài)網(wǎng)頁(yè),指已經(jīng)裝載好內(nèi)容HTML頁(yè)面,無(wú)需經(jīng)過(guò)請(qǐng)求服務(wù)器數(shù)據(jù)和編譯過(guò)程,直接加載到客戶瀏覽器上顯示出來(lái)。通俗的說(shuō)就是生成獨(dú)立的HTML頁(yè)面,且不與服務(wù)器進(jìn)行數(shù)據(jù)交互。
優(yōu)缺點(diǎn)描述:
- 靜態(tài)網(wǎng)頁(yè)的內(nèi)容穩(wěn)定,頁(yè)面加載速度極快;
- 不與服務(wù)器交互,提升安全性;
- 靜態(tài)網(wǎng)頁(yè)的交互性差,數(shù)據(jù)實(shí)時(shí)性很低;
- 維度成本高,生成很多HTML頁(yè)面;
動(dòng)態(tài)頁(yè)面
指跟靜態(tài)網(wǎng)頁(yè)相對(duì)的一種網(wǎng)頁(yè)編程技術(shù),頁(yè)面的內(nèi)容需要請(qǐng)求服務(wù)器獲取,在不考慮緩存的情況下,服務(wù)接口的數(shù)據(jù)變化,頁(yè)面加載的內(nèi)容也會(huì)實(shí)時(shí)變化,顯示的內(nèi)容卻是隨著數(shù)據(jù)庫(kù)操作的結(jié)果而動(dòng)態(tài)改變的。
優(yōu)缺點(diǎn)描述:
- 動(dòng)態(tài)網(wǎng)頁(yè)的實(shí)時(shí)獲取數(shù)據(jù),延遲性低;
- 依賴數(shù)據(jù)庫(kù)交互,頁(yè)面維護(hù)成本很低;
- 與數(shù)據(jù)庫(kù)實(shí)時(shí)交互,安全控制的成本高;
- 頁(yè)面加載速度十分依賴數(shù)據(jù)庫(kù)和服務(wù)的性能;
動(dòng)態(tài)頁(yè)面和靜態(tài)頁(yè)面有很強(qiáng)的相對(duì)性,對(duì)比之下也比較好理解。
2、應(yīng)用場(chǎng)景
動(dòng)態(tài)頁(yè)面靜態(tài)化處理的應(yīng)用場(chǎng)景非常多,例如:
- 大型網(wǎng)站的頭部和底部,靜態(tài)化之后統(tǒng)一加載;
- 媒體網(wǎng)站,內(nèi)容經(jīng)過(guò)渲染,直接轉(zhuǎn)為HTML網(wǎng)頁(yè);
- 高并發(fā)下,CDN邊緣節(jié)點(diǎn)代理的靜態(tài)網(wǎng)頁(yè);
- 電商網(wǎng)站中,復(fù)雜的產(chǎn)品詳情頁(yè)處理;
靜態(tài)化技術(shù)的根本:提示服務(wù)的響應(yīng)速度,或者說(shuō)使響應(yīng)節(jié)點(diǎn)提前,如一般的流程,頁(yè)面(客戶端)請(qǐng)求服務(wù),服務(wù)處理,響應(yīng)數(shù)據(jù),頁(yè)面裝載,一系列流程走下來(lái)不僅復(fù)雜,而且耗時(shí),如果基于靜態(tài)化技術(shù)處理之后,直接加載靜態(tài)頁(yè)面,好了請(qǐng)求結(jié)束。
二、流程分析
靜態(tài)頁(yè)面轉(zhuǎn)換是一個(gè)相對(duì)復(fù)雜的過(guò)程,其中核心流程如下:

- 開(kāi)發(fā)一個(gè)頁(yè)面模板,即靜態(tài)網(wǎng)頁(yè)樣式;
- 提供接口,給頁(yè)面模板獲取數(shù)據(jù);
- 頁(yè)面模板中編寫(xiě)數(shù)據(jù)接口返參的解析流程;
- 基于解析引擎,把數(shù)據(jù)和頁(yè)面模板合并;
- 頁(yè)面模板內(nèi)容加載完成后轉(zhuǎn)換為HTML靜態(tài)頁(yè)面;
- HTML靜態(tài)頁(yè)面上傳到文件服務(wù)器;
- 客戶端(Client)獲取靜態(tài)頁(yè)面的url加載顯示;
主流程大致如上,如果數(shù)據(jù)接口響應(yīng)參數(shù)有變,則需要重新生成靜態(tài)頁(yè),所以在數(shù)據(jù)的加載實(shí)時(shí)性上面會(huì)低很多。
三、代碼實(shí)現(xiàn)案例
1、基礎(chǔ)依賴
FreeMarker是一款模板引擎:即一種基于模板和要改變的數(shù)據(jù),并用來(lái)生成輸出文本(HTML網(wǎng)頁(yè)、電子郵件、配置文件、源代碼等)的通用工具。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
2、頁(yè)面模板
這里既使用FreeMarker開(kāi)發(fā)的模板樣式。
<html>
<head>
<title>PageStatic</title>
</head>
<body>
主題:${myTitle}<br/>
<#assign text="{'auth':'cicada','date':'2020-07-16'}" />
<#assign data=text?eval />
作者:${data.auth} 日期:${data.date}<br/>
<table class="table table-striped table-hover table-bordered" id="editable-sample">
<thead>
<tr>
<th>規(guī)格描述</th>
<th>產(chǎn)品詳情</th>
</tr>
</thead>
<tbody>
<#list tableList as info>
<tr class="">
<td>${info.desc}</td>
<td><img src="${info.imgUrl}" height="80" width="80"></td>
</tr>
</#list>
</tbody>
</table><br/>
<#list imgList as imgIF>
<img src="${imgIF}" height="300" width="500">
</#list>
</body>
</html>
FreeMarker的語(yǔ)法和原有的HTML語(yǔ)法基本一致,但是具有一套自己的數(shù)據(jù)處理標(biāo)簽,用起來(lái)不算復(fù)雜。
3、解析過(guò)程
通過(guò)解析,把頁(yè)面模板和數(shù)據(jù)接口的數(shù)據(jù)合并到一起即可。
@Service
public class PageServiceImpl implements PageService {
private static final Logger LOGGER = LoggerFactory.getLogger(PageServiceImpl.class) ;
private static final String PATH = "/templates/" ;
@Override
public void ftlToHtml() throws Exception {
// 創(chuàng)建配置類
Configuration configuration = new Configuration(Configuration.getVersion());
// 設(shè)置模板路徑
String classpath = this.getClass().getResource("/").getPath();
configuration.setDirectoryForTemplateLoading(new File(classpath + PATH));
// 加載模板
Template template = configuration.getTemplate("my-page.ftl");
// 數(shù)據(jù)模型
Map<String, Object> map = new HashMap<>();
map.put("myTitle", "頁(yè)面靜態(tài)化(PageStatic)");
map.put("tableList",getList()) ;
map.put("imgList",getImgList()) ;
// 靜態(tài)化頁(yè)面內(nèi)容
String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
LOGGER.info("content:{}",content);
InputStream inputStream = IOUtils.toInputStream(content,"UTF-8");
// 輸出文件
FileOutputStream fileOutputStream = new FileOutputStream(new File("F:/page/newPage.html"));
IOUtils.copy(inputStream, fileOutputStream);
// 關(guān)閉流
inputStream.close();
fileOutputStream.close();
}
private List<TableInfo> getList (){
List<TableInfo> tableInfoList = new ArrayList<>() ;
tableInfoList.add(new TableInfo(Constant.desc1, Constant.img01));
tableInfoList.add(new TableInfo(Constant.desc2,Constant.img02));
return tableInfoList ;
}
private List<String> getImgList (){
List<String> imgList = new ArrayList<>() ;
imgList.add(Constant.img02) ;
imgList.add(Constant.img02) ;
return imgList ;
}
}
生成后的HTML頁(yè)面直接使用瀏覽器打開(kāi)即可,不再需要依賴任何數(shù)據(jù)接口服務(wù)。
四、源代碼地址
GitHub·地址 https://github.com/cicadasmile/middle-ware-parent
GitEE·地址 https://gitee.com/cicadasmile/middle-ware-parent
到此這篇關(guān)于SpringBoot2 整合FreeMarker實(shí)現(xiàn)頁(yè)面靜態(tài)化示例詳解的文章就介紹到這了,更多相關(guān)SpringBoot2 整合FreeMarker實(shí)現(xiàn)頁(yè)面靜態(tài)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot整合freemarker的踩坑及解決
- springboot整合freemarker代碼自動(dòng)生成器
- Springboot整合Freemarker的實(shí)現(xiàn)詳細(xì)過(guò)程
- springboot 自定義權(quán)限標(biāo)簽(tld),在freemarker引用操作
- Springboot整合freemarker 404問(wèn)題解決方案
- SpringBoot2.2.X用Freemarker出現(xiàn)404的解決
- 構(gòu)建SpringBoot+MyBatis+Freemarker的項(xiàng)目詳解
- SpringBoot整合FreeMarker的過(guò)程詳解
相關(guān)文章
spring 自動(dòng)注入AutowiredAnnotationBeanPostProcessor源碼解析
這篇文章主要介紹了spring自動(dòng)注入AutowiredAnnotationBeanPostProcessor源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Spring Boot項(xiàng)目集成UidGenerato的方法步驟
這篇文章主要介紹了Spring Boot項(xiàng)目集成UidGenerato的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
SpringBoot配置文件啟動(dòng)加載順序的方法步驟
SpringBoot的啟動(dòng)加載順序涉及多個(gè)步驟和組件,通過(guò)分層和優(yōu)先級(jí)機(jī)制加載配置文件,確保在啟動(dòng)時(shí)正確配置應(yīng)用程序,本文就來(lái)介紹一下SpringBoot配置文件啟動(dòng)加載順序的方法步驟,感興趣的可以了解一下2024-11-11
springboot項(xiàng)目配置多個(gè)kafka的示例代碼
這篇文章主要介紹了springboot項(xiàng)目配置多個(gè)kafka,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記
對(duì)于正則這個(gè)東西,對(duì)我來(lái)說(shuō)一直是很懵逼的,每次用每次查,然后還是記不住,下面這篇文章主要給大家介紹了關(guān)于Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記的相關(guān)資料,需要的朋友可以參考下2022-07-07

