Freemark頁面靜態(tài)化
1、什么是頁面靜態(tài)華
將動態(tài)頁面轉(zhuǎn)化成靜態(tài)的html,降低與數(shù)據(jù)庫的交互次數(shù),提高頁面的訪問速度
就是服務(wù)器在請求來之前把已經(jīng)固定好的東西先編譯好了,等請求來了再動態(tài)的填數(shù)據(jù),不要等請求來了什么都沒做忙得半死
利用第三方提供的模板引擎,生成對應(yīng)的html
thymeleaf
freemark
Velocity
2、為什么要使用網(wǎng)頁靜態(tài)化技術(shù)
網(wǎng)頁靜態(tài)化技術(shù)和緩存技術(shù)的共同點都是為了減輕數(shù)據(jù)庫的訪問壓力 而網(wǎng)頁靜態(tài)化比較適合大規(guī)模且相對變化不太頻繁的數(shù)據(jù)。另外網(wǎng)頁靜態(tài)化還有利于SEO。 將網(wǎng)頁以純靜態(tài)化的形式展現(xiàn),就可以使用Nginx這樣的高性能的web服務(wù)器來部署 Nginx可以承載5萬的并發(fā),而Tomcat只有幾百
3、Freemarker
3.1、什么是 Freemarker
freemarker是apache的一個開源的模板引擎,它基于模板來生成文本輸出。
freemaker模板引擎可以通過模板和數(shù)據(jù)生成靜態(tài)化頁面.
3.2、優(yōu)點
1. 提前根據(jù)模板和數(shù)據(jù)生成靜態(tài)化頁面通過io流將頁面寫入到硬盤上, 訪問的時候直接訪問.就不用訪問數(shù)據(jù)庫了, 可以大大提高數(shù)據(jù)庫的高并發(fā)讀取性能. 是數(shù)據(jù)庫訪問量降低.
由于頁面是提前生成好的, 所以訪問速度快, 客戶體驗好
由于html不需要tomcat解析瀏覽器可以直接訪問, 所以給tomcat降低高并發(fā)訪問壓力.
3.3、使用場景
新聞網(wǎng)站新聞頁面通過freemarker提前生成好 電商網(wǎng)站商品詳情頁面通過freemarker提前生成好 原則:頁面有固定的樣式, 并且一次生成多次讀取, 盡量少的改動數(shù)據(jù)
3.4、運行過程

3.5、模板
模板在freemarker中是以.ftl為后綴名的文件, 在模板中可以使用html標(biāo)簽, css, js,圖片等靜態(tài)資源
模板中可以使用el表達式獲取數(shù)據(jù), 但是無法使用jstl標(biāo)簽來判斷和循環(huán), 所以模板引擎會有自己的一套標(biāo)簽庫供我們使用.
3.6、數(shù)據(jù)
數(shù)據(jù)一般存儲在關(guān)系型數(shù)據(jù)庫或者redis或者mongodb中獲取.
3.7、模板文件中四種元素
文本,直接輸出的部分
注釋,即<#—…—>格式不會輸出
插值(Interpolation):即${..}部分,將使用數(shù)據(jù)模型中的部分替代輸出
FTL指令:FreeMarker指令,和HTML標(biāo)記類似,名字前加#予以區(qū)分,不會輸出
4、入門程序
4.1、創(chuàng)建Maven工程

4.2、引入pom依賴
<dependency>
? ? ? ?
<groupId>org.freemarker</groupId>
? ? ? <artifactId>freemarker</artifactId>
? ? ? ?
<version>2.3.23</version>?
</dependency>
創(chuàng)建模板文件

<html>?
<head>
? ?
<meta charset="utf-8">
? ?
<title>Freemarker入門小DEMO </title>?
</head>?
<body>?
<#--注釋內(nèi)容 ?-->?
${name},你好。${message}?
</body>?
</html>
生成文件
創(chuàng)建一個測試類

public class TestFreemarker {
? ?
/*
第一步:創(chuàng)建一個 Configuration 對象,直接 new 一個對象。構(gòu)造方法的參數(shù)就是 freemarker的版本號。
? ?
第二步:設(shè)置模板文件所在的路徑。
? ?
第三步:設(shè)置模板文件使用的字符集。一般就是 utf-8.
? ?
第四步:加載一個模板,創(chuàng)建一個模板對象。
? ?
第五步:創(chuàng)建一個模板使用的數(shù)據(jù)集,可以是 pojo 也可以是 map。一般是 Map。
? ?
第六步:創(chuàng)建一個 Writer 對象,一般創(chuàng)建一 FileWriter 對象,指定生成的文件名。
??
第七步:調(diào)用模板對象的 process 方法輸出文件。
? ?
第八步:關(guān)閉流
*/
? ?public static void main(String[] args) throws Exception {
? ? ? ?//1.創(chuàng)建配置類
? ? ? ?
Configuration configuration=new Configuration(Configuration.getVersion());
? ? ? ?
//2.設(shè)置模板所在的目錄(絕對路徑)
? ? ? ?configuration.setDirectoryForTemplateLoading(new File("D:\\java\\撩課-高新強\\分布式項目(代碼)\\code2\\FreeMarkerPro\\src\\main\\resources\\ftl"));
? ? ? ?
//3.設(shè)置字符集
? ? ? ?configuration.setDefaultEncoding("utf-8");
? ? ??
//4.加載模板
? ? ? ?Template template = configuration.getTemplate("MyFreemark.ftl");
? ? ? ?
//5.創(chuàng)建數(shù)據(jù)模型
? ? ? ?
Map map=new HashMap();
? ? ? ?
map.put("name", "joker");
? ? ? ?
map.put("message", "welcome Freemarker");
? ? ? ?
//6.創(chuàng)建Writer對象
? ? ? ?
Writer out =new FileWriter(new File("d:\\test.html"));
? ? ? ?
//7.輸出
? ? ? ?
template.process(map, out);
? ? ? ?
//8.關(guān)閉Writer對象
? ? ? ?
out.close();
? ?
}
}
4.3、點擊測試
生成文件在D:test.html

5、FTL指令
5.1、assign指令
此指令用于在頁面上定義一個變量

<#assign myname="Myxq--">?
${myname}
定義對象類型

<#assign info={"name":"myxqName",'age':'30'} >?
電話:${info.name} ?地址:${info.age}
5.2、list指令
遍歷數(shù)組

?List goodsList=new ArrayList();
? ? ? ?
goodsList.add("goods1");
? ? ??
?goodsList.add("goods2");
? ? ? ?
goodsList.add("goods3");
? ? ? ?
Map map=new HashMap();
? ? ? ?
map.put("goodsList",goodsList);
? ? ? ?
//6.創(chuàng)建Writer對象
? ? ? ?
Writer out =new FileWriter(new File("d:\\test.html"));
? ? ? ?
//7.輸出
? ? ? ?
template.process(map, out);

<#list users as user>
? ?
${user_index} --- ${user.name}--${user.age}?
</#list>
5.3、if指令

<#assign myname="myxq">?
<#if myname="myxq">
? ?
<h1>大標(biāo)題1myxq</h1>?
<#else>
? ?
<h1>大標(biāo)題2</h1>?
</#if>
5.4、include指令
用于模板文件的嵌套

<#include "header.ftl">
總結(jié)
與緩存技術(shù)的一樣都是為了減輕數(shù)據(jù)庫的訪問壓力 而網(wǎng)頁靜態(tài)化比較適合大規(guī)模且相對變化不太頻繁的數(shù)據(jù)。另外網(wǎng)頁靜態(tài)化還有利于SEO。 將網(wǎng)頁以純靜態(tài)化的形式展現(xiàn),就可以使用Nginx這樣的高性能的web服務(wù)器來部署 Nginx可以承載5萬的并發(fā),而Tomcat只有幾百,這也是Freemark的優(yōu)勢。
