SpringBoot2 整合FreeMarker模板,完成頁面靜態化處理

来源:https://www.cnblogs.com/cicada-smile/archive/2020/07/20/13348253.html
-Advertisement-
Play Games

本文源碼:GitHub·點這裡 || GitEE·點這裡 一、頁面靜態化 1、動靜態頁面 靜態頁面 即靜態網頁,指已經裝載好內容HTML頁面,無需經過請求伺服器數據和編譯過程,直接載入到客戶瀏覽器上顯示出來。通俗的說就是生成獨立的HTML頁面,且不與伺服器進行數據交互。 優缺點描述: 靜態網頁的內容 ...


本文源碼:GitHub·點這裡 || GitEE·點這裡

一、頁面靜態化

1、動靜態頁面

靜態頁面

即靜態網頁,指已經裝載好內容HTML頁面,無需經過請求伺服器數據和編譯過程,直接載入到客戶瀏覽器上顯示出來。通俗的說就是生成獨立的HTML頁面,且不與伺服器進行數據交互。

優缺點描述:

  • 靜態網頁的內容穩定,頁面載入速度極快;
  • 不與伺服器交互,提升安全性;
  • 靜態網頁的交互性差,數據實時性很低;
  • 維度成本高,生成很多HTML頁面;

動態頁面

指跟靜態網頁相對的一種網頁編程技術,頁面的內容需要請求伺服器獲取,在不考慮緩存的情況下,服務介面的數據變化,頁面載入的內容也會實時變化,顯示的內容卻是隨著資料庫操作的結果而動態改變的。

優缺點描述:

  • 動態網頁的實時獲取數據,延遲性低;
  • 依賴資料庫交互,頁面維護成本很低;
  • 與資料庫實時交互,安全控制的成本高;
  • 頁面載入速度十分依賴資料庫和服務的性能;

動態頁面和靜態頁面有很強的相對性,對比之下也比較好理解。

2、應用場景

動態頁面靜態化處理的應用場景非常多,例如:

  • 大型網站的頭部和底部,靜態化之後統一載入;
  • 媒體網站,內容經過渲染,直接轉為HTML網頁;
  • 高併發下,CDN邊緣節點代理的靜態網頁;
  • 電商網站中,複雜的產品詳情頁處理;

靜態化技術的根本:提示服務的響應速度,或者說使響應節點提前,如一般的流程,頁面(客戶端)請求服務,服務處理,響應數據,頁面裝載,一系列流程走下來不僅複雜,而且耗時,如果基於靜態化技術處理之後,直接載入靜態頁面,好了請求結束。

二、流程分析

靜態頁面轉換是一個相對複雜的過程,其中核心流程如下:

  • 開發一個頁面模板,即靜態網頁樣式;
  • 提供介面,給頁面模板獲取數據;
  • 頁面模板中編寫數據介面返參的解析流程;
  • 基於解析引擎,把數據和頁面模板合併;
  • 頁面模板內容載入完成後轉換為HTML靜態頁面;
  • HTML靜態頁面上傳到文件伺服器;
  • 客戶端(Client)獲取靜態頁面的url載入顯示;

主流程大致如上,如果數據介面響應參數有變,則需要重新生成靜態頁,所以在數據的載入實時性上面會低很多。

三、代碼實現案例

1、基礎依賴

FreeMarker是一款模板引擎:即一種基於模板和要改變的數據,並用來生成輸出文本(HTML網頁、電子郵件、配置文件、源代碼等)的通用工具。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

2、頁面模板

這裡既使用FreeMarker開發的模板樣式。

<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>規格描述</th>
        <th>產品詳情</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的語法和原有的HTML語法基本一致,但是具有一套自己的數據處理標簽,用起來不算複雜。

3、解析過程

通過解析,把頁面模板和數據介面的數據合併到一起即可。

@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 {
        // 創建配置類
        Configuration configuration = new Configuration(Configuration.getVersion());
        // 設置模板路徑
        String classpath = this.getClass().getResource("/").getPath();
        configuration.setDirectoryForTemplateLoading(new File(classpath + PATH));
        // 載入模板
        Template template = configuration.getTemplate("my-page.ftl");
        // 數據模型
        Map<String, Object> map = new HashMap<>();
        map.put("myTitle", "頁面靜態化(PageStatic)");
        map.put("tableList",getList()) ;
        map.put("imgList",getImgList()) ;
        // 靜態化頁面內容
        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);
        // 關閉流
        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頁面直接使用瀏覽器打開即可,不再需要依賴任何數據介面服務。

四、源代碼地址

GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent

推薦閱讀:微服務架構系列

序號 標題
01 微服務架構:項目技術選型簡介,架構圖解說明
02 微服務架構:業務架構設計,系統分層管理
03 微服務架構:資料庫選型簡介,業務數據規劃設計
04 微服務架構:中間件集成,公共服務封裝
05 微服務架構:SpringCloud 基礎組件應用設計
06 微服務架構:通過業務、應用、技術、存儲,聊聊架構
07 微服務技術棧:常見註冊中心組件,對比分析
08 微服務技術棧:流量整形演算法,服務熔斷與降級

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...