基于SpringBoot和Freemarker的頁面靜態化

頁面靜態化能夠緩輕數據庫的壓力,還能提高頁面的并發能力,但是網頁靜態化是比較適合大規模且相對變化不太頻繁的數據。

頁面靜態化在實際應用中還是比較常見的,比如博客詳情頁、新聞網站或者文章類網站等等。這類數據變化不頻繁比較適合靜態化頁面。該篇博客就是介紹博客詳情頁的頁面靜態化輸出。

頁面靜態化實現

導入Jar

compile group: 'org.springframework.boot', name: 'spring-boot-starter-freemarker', version: '2.1.6.RELEASE'

配置文件

server:port: 8015servlet:context-path: /staticftl# freemarker靜態資源配置
# 文件路徑
spring:freemarker:tempalte-loader-path: classpath:/templates
# 關閉緩存,及時刷新cache:  falsecharset:  UTF-8content-type: text/htmlsuffix: .htmlmvc:static-path-pattern: /static/**

編寫模板文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>${blog.title}</title>
</head>
<body>
<h1>${blog.title}</h1>
<h2>${blog.author}</h2>
<div>${blog.content}</div>
</body>
</html>

Freemarker還提供很多其他的常用的指令和函數,功能也是非常強大的。

頁面輸出

 /*** 輸出靜態化頁面* @param root* @param id*/
public void productStaticPage(Map<String,Object> root, String id){Configuration config = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);config.setDefaultEncoding("UTF-8");//輸出頁面的全名String path = getStaticHtmlPath()+"/" + id + ".html";File f = new File(path);File parentFile = f.getParentFile();if(!parentFile.exists()){parentFile.mkdirs();}Writer out = null;try {//獲取模板頁面String templatePath =ClassLoader.getSystemResource("templates").getPath();TemplateLoader templateLoader=new FileTemplateLoader(new File(templatePath+"\\blog"));config.setTemplateLoader(templateLoader);Template template = config.getTemplate("detail.html");//輸出頁面out = new OutputStreamWriter(new FileOutputStream(f), "UTF-8");//處理數據template.process(root, out);} catch (Exception e) {e.printStackTrace();}finally {if(null != out){try {out.close();} catch (IOException e) {e.printStackTrace();}}}
}

通過Freemarker輸出靜態頁面。

/*** 魔改的Freemarker的靜態化頁面輸出地址* 不具備普遍性* @return 靜態化頁面輸出地址*/
public String getStaticHtmlPath(){//Thread.currentThread().getContextClassLoader().getResource("templates").getPath()String path = this.getClass().getClassLoader().getResource("").getPath();if(path==null || path.length()==0){return "";}path=path.substring(0,path.indexOf("build"))+"\\src\\main\\resources\\static\\html";return path;
}

這個代碼在實際應用是需要更改的,目前是在本機Windows中,且把靜態化頁面放到了項目目錄中,其實更好的結果是將輸出靜態化頁面放到Nginx服務器中,這樣在并發性也更高,而且目錄環境也更好解決。

本身使用Freemarker輸出靜態頁面是比較簡單的,上述關鍵代碼再加上一些串聯代碼應該能正常運行了,其中需要注意的就是相關目錄,里面涉及到一個模板目錄,用于讀取模板;一個輸出頁面目錄,目前是使用SpringBoot并把static目錄當做靜態資源,所以需要把靜態頁面放入此目錄,但是建議使用Nginx來做靜態頁面的服務器。

加入消息中間件和MongoDB數據庫

我又加入了一點小功能,實現當我們將博客數據保存到MongoDB數據庫中,使用ActiveMQ隊列功能,異步將博客數據靜態化到頁面中然后輸出。

引入Jar

compile group: 'org.springframework.boot', name: 'spring-boot-starter-activemq', version: '2.1.6.RELEASE'
# 需要引入如下Jar包,不然ActiveMQ的配置無法導入。
compile group: 'org.messaginghub', name: 'pooled-jms', version: '1.1.0'
compile group: 'org.springframework.data', name: 'spring-data-mongodb', version: '2.1.6.RELEASE'

配置文件

spring:data:mongodb:host: 127.0.0.1port: 27017database: staticftlactivemq:broker-url: tcp://localhost:61616#true 表示使用內置的MQ,false則連接服務器in-memory: false#true表示使用連接池;false時,每發送一條數據創建一個連接pool:enabled: true#連接池最大連接數max-connections: 10idle-timeout: 30000user: adminpassword: admin

使用MongoDB

import com.plf.learn.staticftl.bean.Blog;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;@Repository
public interface BlogRepository extends MongoRepository<Blog,java.lang.String> {
}

SpringBoot自帶的封裝MongoDB的操作,使得數據庫操作變得非常簡單。

使用ActiveMQ

發送隊列消息

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;@Component
public class ActiveMQProducer {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;/**** @param destination   隊列* @param message   信息*/public void sendMessage(String destination,String message){jmsMessagingTemplate.convertAndSend(destination,message);}
}

監聽隊列,將數據靜態化到頁面上

import com.plf.learn.staticftl.bean.Blog;
import com.plf.learn.staticftl.service.BlogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;@Component
public class BlogStaticFtlListener {@Autowiredprivate BlogService blogService;@JmsListener(destination="staticftl.blog")public void ListenBlogQueue(String message){String blog_id = message;//獲取到博客信息Blog blog = blogService.getById(blog_id);Map<String,Object> map = new HashMap<>();map.put("blog",blog);//輸出靜態化頁面blogService.productStaticPage(map,blog_id);}
}

上述代碼即可實現,將博客文章保存到MongoDB數據庫中,然后通過消息中間件消費輸出靜態化頁面,即可直接訪問靜態資源。完整代碼可訪問我的Github。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42060.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42060.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42060.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

56.linux 進程管理命令和用戶管理命令

目錄 一、進程管理命令 1.ps 2.pstree 3.kill 4.pkill 5.&后臺運行程序 6.jobs 7.fg bg 8.top 二、用戶管理命令 1.系統存儲用戶信息的文件 2.添加新用戶 3.修改用戶密碼 4.刪除用戶 一、進程管理命令 1.ps 用于查看當前系統中運行的進程信息。它可以…

Golang 程序性能優化利器 PGO 詳解(一):簡單介紹及使用

在軟件開發過程中&#xff0c;性能優化是不可或缺的一部分。無論是在Web服務、數據處理系統還是實時通信中&#xff0c;良好的性能都是至關重要的。Golang 從1.20版版本開始引入的 Profile Guided Optimization&#xff08;PGO&#xff09;機制能夠幫助更好地優化 Go 程序的性能…

The Age of Data and AI: Challenges and Opportunities

Simply put Abstract: This paper examines the impact of the “Age of Data” on the field of artificial intelligence (AI). With the proliferation of digital technologies and advancements in data collection, storage, and processing, organizations now have ac…

進行 200 瓦太陽能 (PV) 模塊設計以測量太陽能光伏陣列的電壓、電流和功率、綜合負荷頻率和電壓控制系統的方法研究(Simulink實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

Levenshtein python調用

函數解釋&#xff1a; Levenshtein距離又稱作編輯距離&#xff08;Edit Distance&#xff09;&#xff0c;是指兩個字符之間&#xff0c;由一個字符轉變成另一個字符所需的最少編輯操作次數。被允許的操作有以下幾種&#xff1a; a. Replace替換&#xff0c;將一個字符替換成另…

如何使用CSS實現一個響應式視頻播放器?

聚沙成塔每天進步一點點 ? 專欄簡介? 使用CSS實現響應式視頻播放器? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&#xff01;這個專欄是為那些對Web開發感興趣…

vue輸入框只能輸入數字類型,禁止輸入和粘貼e

js怎么去除1e里面e 方法一&#xff1a;使用 Number() 函數將科學計數法表示的字符串轉換為數字。然后&#xff0c;使用 toString() 方法將其轉換回字符串形式&#xff0c;這樣就會自動移除科學計數法中的 "e" var num 1e10; // 科學計數法表示的數字 var numStr …

【小夢C嘎嘎——啟航篇】string介紹以及日常使用的接口演示

【小夢C嘎嘎——啟航篇】string 使用&#x1f60e; 前言&#x1f64c;C語言中的字符串標準庫中的string類string 比較常使用的接口對上述函數和其他函數的測試代碼演示&#xff1a; 總結撒花&#x1f49e; &#x1f60e;博客昵稱&#xff1a;博客小夢 &#x1f60a;最喜歡的座右…

c語言每日一練(9)

前言&#xff1a;每日一練系列&#xff0c;每一期都包含5道選擇題&#xff0c;2道編程題&#xff0c;博主會盡可能詳細地進行講解&#xff0c;令初學者也能聽的清晰。每日一練系列會持續更新&#xff0c;暑假時三天之內必有一更&#xff0c;到了開學之后&#xff0c;將看學業情…

rollup工具打包報錯問題匯總

1. (!) this has been rewritten to undefined 原因&#xff1a;這是因為打包后沒有給this指向window&#xff0c;導致this undefined&#xff0c;因此需要配置context參數來指定代碼執行環境的參數為window 解決&#xff1a;rollup.config.js文件中添加配置 module.exports…

算法通關村第十關 | 數組中第k個最大元素

1.數組中第k大的數字 題目&#xff1a; LeetCode&#xff1a;數組中的第k個最大元素&#xff0c;給定整數數組nums和整數k&#xff0c;請返回數組中第k個最大的元素&#xff0c;請注意&#xff0c;你需要找的是數組排序后第k個最大的元素&#xff0c;而不是第k個不同的元素。 運…

JVM——配置常用參數,GC調優策略

文章目錄 JVM 配置常用參數Java內存區域常見配置參數概覽堆參數回收器參數項目中常用配置常用組合 常用 GC 調優策略GC 調優原則GC 調優目的GC 調優策略 JVM 配置常用參數 Java內存區域常見配置參數概覽堆參數&#xff1b;回收器參數&#xff1b;項目中常用配置&#xff1b;常…

element-Plus中el-menu菜單無法正常收縮解決方案

<el-menu :collapse"true">如圖所示收縮之后&#xff0c;有子級的菜單還有箭頭文字顯示 從代碼對比看層級就不太對了&#xff0c;嵌套錯誤了&#xff0c;正常下方官網的ul標簽下直接是li&#xff0c;在自己的代碼中&#xff0c;ul標簽下是div標簽&#xff0c;層…

FairyGUI編輯器自定義菜單擴展插件

本文涉及到的軟件有&#xff1a;FairyGUI&#xff0c;VSCode 代碼環境涉及到了&#xff1a;Lua VSCode插件&#xff1a;EmmyLua 在編寫FairyGUI編輯器菜單前&#xff0c;了解一下FairyGUIEditor的API會有效的幫助我們解決很多問題。FairyGUI的擴展是通過編輯器自帶的插件功能…

【嵌入式】MKV31F512VLL12 微控制器 (MCU) 、Cyclone? IV E EP4CE10E22I8LN,FPGA-現場可編程門陣列芯片

1、MKV31F512VLL12 微控制器 (MCU) 是適用于BLDC、PMSM和ACIM電機控制應用的高性能解決方案。這些MCU采用運行頻率為100MHz/120MHz、帶數字信號處理 (DSP) 和浮點單元 (FPU) 的ARM Cortex-M4內核。KV3x MCU配備兩個采樣率高達1.2MS/s的16位ADC、多個控制定時器以及512KB閃存。 …

Codeforces Round 893 (Div. 2) D.Trees and Segments

原題鏈接&#xff1a;Problem - D - Codeforces 題面&#xff1a; 大概意思就是讓你在翻轉01串不超過k次的情況下&#xff0c;使得a*&#xff08;0的最大連續長度&#xff09;&#xff08;1的最大連續長度&#xff09;最大&#xff08;1<a<n&#xff09;。輸出n個數&…

模糊測試面面觀 | 模糊測試工具知多少

自1988年威斯康星大學的Barton Miller首次提出模糊測試這一概念以來&#xff0c;模糊測試領域經歷了持續長久發展。模糊測試作為一種軟件測試方法&#xff0c;旨在通過向程序輸入模糊、隨機、異常的數據&#xff0c;探測和發現潛在的漏洞和錯誤。這種方法備受安全研究人員的青睞…

助推打造全球研發中心城市 | 李彥團隊:研發,帶來了二次文藝復興

2017年&#xff0c;長沙經聯合國教科文組織評選&#xff0c;成為中國首座獲評世界“媒體藝術之都”稱號的城市。6年后&#xff0c;基于時代發展的新要求&#xff0c;長沙再次提出了“打造全球研發中心城市”的目標&#xff0c;并朝著新的方向邁進。 舊有的優勢產業在新的研發浪…

信安通用基礎知識

文章目錄 密碼學經典誤區PGP優良保密協議信安經典其它安全手段XSS與CSRF cross site request forgeryCSRF的利用邏輯CSRF示例CSRF防范檢查Referer字段添加校驗token XSS cross site scripting common weakness enumeration常見密碼api誤用&#xff08;摘自畢設參考文獻&#xf…

“深入探究JVM內部機制:如何實現Java程序的運行環境?“

標題&#xff1a;深入探究JVM內部機制&#xff1a;如何實現Java程序的運行環境&#xff1f; 摘要&#xff1a;本文將深入探究Java虛擬機&#xff08;JVM&#xff09;的內部機制&#xff0c;重點討論JVM如何實現Java程序的運行環境。我們將從JVM的結構、類加載、內存管理、垃圾…