网页静态化技术Freemarker
網頁靜態化技術Freemarker
一.Freemarker的基本介紹
1.1為什么要使用網頁靜態化技術
網頁靜態化解決方案在實際開發中運用比較多,例如新聞網站,門戶網站中的新聞頻道或者是文章類的頻道。
對于電商網站的商品詳細頁來說,至少幾百萬個商品,每個商品又有大量的信息,這樣的情況同樣也適用于使用網頁靜態化來解決。
網頁靜態化技術和緩存技術的共同點都是為了減輕數據庫的訪問壓力,但是具體的應用場景不同,緩存比較適合小規模的數據,而網頁靜態化比較適合大規模且相對變化不太頻繁的數據。另外網頁靜態化還有利于SEO。
另外我們如果將網頁以純靜態化的形式展現,就可以使用Nginx這樣的高性能的web服務器來部署。Nginx可以承載5萬的并發,而Tomcat只有幾百。
1.2 什么是 Freemarker
FreeMarker 是一個用 Java 語言編寫的模板引擎,它基于模板來生成文本輸出。FreeMarker與 Web 容器無關,即在 Web 運行時,它并不知道 Servlet 或 HTTP。它不僅可以用作表現層的實現技術,而且還可以用于生成 XML,JSP 或 Java 等。
二. Freemarker入門小DEMO
2.1工程引入依賴
1 <dependency> 2 <groupId>org.freemarker</groupId> 3 <artifactId>freemarker</artifactId> 4 <version>2.3.23</version> 5 </dependency>View Code
?2.2?創建模板文件
模板文件中四種元素:
?1、文本,直接輸出的部分
? 2、注釋,即<#--...-->格式不會輸出
? 3、插值(Interpolation):即${..}部分,將使用數據模型中的部分替代輸出
? 4、FTL指令:FreeMarker指令,和HTML標記類似,名字前加#予以區分,不會輸出
我們現在就創建一個簡單的創建模板文件test.ftl
1 <html> 2 <head> 3 <meta charset="utf-8"> 4 <title>Freemarker入門小DEMO </title> 5 </head> 6 <body> 7 <#--我只是一個注釋,我不會有任何輸出 --> 8 ${name},你好。${message} 9 </body> 10 </html>View Code
這里有文本、插值和注釋
2.3 生成文件
使用步驟:
第一步:創建一個 Configuration 對象,直接 new 一個對象。構造方法的參數就是 freemarker的版本號。
第二步:設置模板文件所在的路徑。
第三步:設置模板文件使用的字符集。一般就是 utf-8.
第四步:加載一個模板,創建一個模板對象。
第五步:創建一個模板使用的數據集,可以是 pojo 也可以是 map。一般是 Map。
第六步:創建一個 Writer 對象,一般創建一 FileWriter 對象,指定生成的文件名。
第七步:調用模板對象的 process 方法輸出文件。
第八步:關閉流
代碼(創建Test類 main方法如下):
1 //1.創建配置類 2 Configuration configuration=new Configuration(Configuration.getVersion()); 3 //2.設置模板所在的目錄 4 configuration.setDirectoryForTemplateLoading(new File("D:/javaSE_workplace_utf8/freemarkerTest/src/main/webapp")); 5 //3.設置字符集 6 configuration.setDefaultEncoding("utf-8"); 7 //4.加載模板 8 Template template = configuration.getTemplate("test.ftl"); 9 //5.創建數據模型 10 Map map=new HashMap(); 11 map.put("name", "張三 "); 12 map.put("message", "歡迎來到神奇的freemarker世界!"); 13 //6.創建Writer對象 14 Writer out =new FileWriter(new File("d:\\test.html")); 15 //7.輸出 16 template.process(map, out); 17 //8.關閉Writer對象 18 out.close();View Code
執行后,在D盤根目錄即可看到生成的test.html ,打開看看:
是不是有些小激動呢?
2.4FTL指令
2.4.1 assign指令
此指令用于在頁面上定義一個變量:
(1)定義簡單類型:
1 <#assign linkman="周先生"> 2 聯系人:${linkman} <br />
(2)定義對象類型:
1 <#assign info={"mobile":"13301231212",'address':'北京市昌平區王府街'} > 2 電話:${info.mobile} 地址:${info.address}
運行效果:
2.4.2?include指令
此指令用于模板文件的嵌套,創建模板文件head.ftl
1 <h1>likemebee(來客蜜)信息網</h1> 我們修改test.ftl,在模板文件中使用include指令引入剛才我們建立的模板
1 <#include "head.ftl"> 2.4.3 if指令
在模板文件上添加
1 <#if success=true> 2 你已通過實名認證 3 <#else> 4 你未通過實名認證 5 </#if>
在代碼中對str變量賦值
1 map.put("success", true);
在freemarker的判斷中,可以使用= 也可以使用==?
頁面預覽:
2.4.4 list指令
(1)代碼中對變量goodsList賦值
1 List goodsList=new ArrayList(); 2 Map goods1=new HashMap(); 3 goods1.put("name", "蘋果"); 4 goods1.put("price", 5.8); 5 Map goods2=new HashMap(); 6 goods2.put("name", "香蕉"); 7 goods2.put("price", 2.5); 8 Map goods3=new HashMap(); 9 goods3.put("name", "橘子"); 10 goods3.put("price", 3.2); 11 goodsList.add(goods1); 12 goodsList.add(goods2); 13 goodsList.add(goods3); 14 map.put("goodsList", goodsList);
(2)在模板文件上添加
1 <br />----商品價格表----<br /> 2 <#list goodsList as goods> 3 ${goods_index+1} 商品名稱: ${goods.name} 價格:${goods.price}<br> 4 </#list>
如果想在循環中得到索引,使用循環變量+_index就可以得到。預覽頁面:
2.5 內建函數
內建函數語法格式: 變量+?+函數名稱??
2.5.1獲取集合大小
我們通常要得到某個集合的大小,如下圖:
我們使用size函數來實現,代碼如下:
1 共 ${goodsList?size} 條記錄 2.5.2?轉換JSON字符串為對象
我們通常需要將json字符串轉換為對象,那如何處理呢?看代碼
1 <#assign text="{'bank':'工商銀行','account':'10101920201920212'}" /> 2 <#assign data=text?eval /> 3 開戶行:${data.bank} 賬號:${data.account}
2.5.3日期格式化
代碼中對變量賦值:
1 map.put("today", new Date());
在模板文件中加入
1 <br /> 2 當前日期:${today?date} <br> 3 當前時間:${today?time} <br> 4 當前日期+時間:${today?datetime} <br> 5 日期格式化: ${today?string("yyyy年MM月")}
運行效果如下:
2.5.4數字轉換為字符串
代碼中對變量賦值:
1 map.put("point", 102920122); 修改模板:
1 <br /> 2 累計積分:${point}
頁面顯示:
我們會發現數字會以每三位一個分隔符顯示,有些時候我們不需要這個分隔符,就需要將數字轉換為字符串,使用內建函數c
1 累計積分:${point?c} 頁面顯示效果如下:
2.6 空值處理運算符
如果你在模板中使用了變量但是在代碼中沒有對變量賦值,那么運行生成時會拋出異常。但是有些時候,有的變量確實是null,怎么解決這個問題呢?
2.6.1判斷某變量是否存在:“??”
用法為:variable??,如果該變量存在,返回true,否則返回false?
1 <br /> 2 <#if aaa??> 3 aaa變量存在 4 <#else> 5 aaa變量不存在 6 </#if>
2.6.2缺失變量默認值:“!”
我們除了可以判斷是否為空值,也可以使用!對null值做轉換處理
在模板文件中加入
1 ${aaa!'-'} 在代碼中不對aaa賦值,也不會報錯了 ,當aaa為null則返回!后邊的內容-
2.7 運算符
2.7.1算數運算符
FreeMarker表達式中完全支持算術運算,FreeMarker支持的算術運算符包括:+, - , * , / , %
2.7.2邏輯運算符
邏輯運算符有如下幾個:?
邏輯與:&&?
邏輯或:||?
邏輯非:!?
邏輯運算符只能作用于布爾值,否則將產生錯誤?
2.7.3比較運算符
表達式中支持的比較運算符有如下幾個:?
1? =或者==:判斷兩個值是否相等.?
2? !=:判斷兩個值是否不等.?
3? >或者gt:判斷左邊值是否大于右邊值?
4? >=或者gte:判斷左邊值是否大于等于右邊值?
5? <或者lt:判斷左邊值是否小于右邊值?
6? <=或者lte:判斷左邊值是否小于等于右邊值?
注意:? =和!=可以用于字符串,數值和日期來比較是否相等,但=和!=兩邊必須是相同類型的值,否則會產生錯誤,而且FreeMarker是精確比較,"x","x ","X"是不等的.其它的運行符可以作用于數字和日期,但不能作用于字符串,大部分的時候,使用gt等字母運算符代替>會有更好的效果,因為 FreeMarker會把>解釋成FTL標簽的結束字符,當然,也可以使用括號來避免這種情況,如:<#if (x>y)>?
轉載于:https://www.cnblogs.com/likemebee/p/7815814.html
總結
以上是生活随笔為你收集整理的网页静态化技术Freemarker的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宁财神称不后悔吸毒央视岂不是不可救药现在
- 下一篇: 化妆品一套多少钱啊?