freemarker簡介及入門demo
自我學習freemarker的過程,記錄下來。以供複習,如果不正之處,歡迎各位批評指正。
學習一門技術,我覺得首先清楚兩點,它是什麼,為什麼要用它,怎麼用它。
我們先了解一下freemarker是什麼?以及為什麼要用freemarker?
1.freemarker是什麼?
freemarker是一款模板引擎。基於模板和資料來源來生成輸出文字(比如html、配置檔案、電子郵件、原始碼)的通用工具。它是一個java類庫。
初學的話,我覺得理解到這就可以了。
2.為什麼要用freemarker?
①freemarker實現了將業務邏輯和變現層分離。在Jsp開發中,頁面會有大量的業務邏輯,不利於閱讀和維護,使用freemarker可以避免這個問題
②有利於團隊分工合作,前端設計師可以關注頁面的設計而無需面對頁面的業務邏輯,同時修改頁面程式碼也不需要程式設計師重新編譯程式碼
③提高開發效率,freemarker不需要每次修改後重新編譯,因為是直接生成一個頁面返回的;而Jsp再修改之後,是需要重新編譯的。在開發除錯中可以有效節省時間。
寫到第三點的時候,有點犯迷糊了。突然不知道修改了jsp之後,tomcat是否需要重啟了。在網上查的時候,發現一個答案解答的很好,一併寫在這裡:
舉例來說,你現在需要給你家裡的電視搭一塊布,你需要把電視的總電源都關掉,搭好之後再開啟麼?這塊布就類似jsp,jsp就只是一個展示的東西,一個介面而已。但是當你想給電視機裡面換一個零件,你難道不斷電就直接換麼?電視機裡面的零件就相當於class,因為class是需要tomcat提前載入好的。所以當你修改了class的時候,需要重啟tomcat再載入一次。
④有利於提高訪問速度。對於不會頻繁發生變化的頁面,建議使用freemarker生成的靜態頁面,而不是每次都要動態生成的JSP頁面。
解釋:因為使用freemarker生成的都是靜態頁面,不需要其他處理,可以直接訪問。
而jsp頁面就需要相應的處理:當一個jsp頁面第一次被訪問的時候, JSP Engine(JSP引擎)首先將jsp頁面轉譯為Servlet,生成的檔案儲存在tomcat/work/Catalina/localhost下;
然後JSPC(jspc編譯器)對轉譯生成的servlet進行編譯 生成.class位元組碼檔案,檔案和servlet在同一個資料夾下(tomcat/work/Catalina/localhost)。
由伺服器訪問.class位元組碼檔案並將對應內容響應給使用者。
(jsp的執行原理 需要更詳細的闡述的可以訪問我另一篇部落格: )
⑤可以提高併發量
⑥靜態頁面對SEO更友好
⑦不佔用JVM的PermGen space。因為不會被變異成類,所以不會佔用web伺服器永生帶的空間,避免OutOfMemoryError:PermGen space的錯誤
關於5、6、7這三點,由於時間原因,沒有深入去了解,以後有時間研究的時候會補上理解。各位見諒哈。
3.基本原理:
下面這張圖應該能闡述明白freemarker的原理
簡單說來就是你可以自己copy一個模板,或者是自己定一個模板,然後在相應的方法中,傳遞引數,引數之一就是這個模板檔案,還要有一個鍵值對的集合引數,map中的key值要與模板中定義的變數相對應。map的value就會替換到模板中的變數的位置。
上面那段話,我自己是能明白,但是我不知道我表述的各位能不能明白,如果不明白的話,結合下面的demo,相信你一定會明白了。(語言表達能力一般,各位大佬勿噴哈~~)
demo:
建立maven專案,打包方式jar。
在pom.xml中匯入依賴:
<!-- freemarker依賴 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
專案的結構如圖:
FreeMarkerTest類程式碼如下:
通過該類的程式碼先了解一下freemarker的基本使用步驟
/**
* freemarker使用步驟:
* 1.建立Configuration例項,負責管理freemarker的模板載入路徑
* 2.通過configuration建立Template例項,並指定使用的模板檔案
* 3.使用Map物件填充模板
* 4.使用Template例項的process方法完成合並
*/
package com.fd.freemarker;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class FreeMarkerTest {
public static void main(String[] args) throws IOException, TemplateException {
//定義模板的載入路徑
String path = FreeMarkerTest.class.getResource("/ftl").getPath();
File file = new File(path);
//建立Configuration例項,負責管理設定freemarker的模板載入路徑
Configuration configuration = new Configuration();
configuration.setDirectoryForTemplateLoading(file);
//設定預設字元編碼
configuration.setDefaultEncoding("utf-8");
//通過configuration建立Template例項
Template template = configuration.getTemplate("user.ftl");
//使用Map物件填充模板
Map<String,String> map = new HashMap<String,String>();
map.put("name","freemarker");
map.put("message","hello,how are you?");
//呼叫template物件的process方法 實現合併
StringWriter stringWriter = new StringWriter();
template.process(map, stringWriter);
//輸出
System.out.println(stringWriter.toString());
}
}
user.ftl內容如下:
執行FreeMarkerTest 結果如下:
看到這裡,應該能明白freemarker的基本使用步驟了吧。
接下來的FreeMarkerTest2類就是簡單的應用,用來生成輸出文字
程式碼如下:
/**
* freemarker使用步驟:
* 1.建立Configuration例項,負責管理freemarker的模板載入路徑
* 2.通過configuration建立Template例項,並指定使用的模板檔案
* 3.使用Map物件填充模板
* 4.使用Template例項的process方法完成合並
*
* 該類測試內容:根據模板和資料來源生成html到指定的位置
*/
package com.fd.freemarker;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class FreeMarkerTest2 {
public static void main(String[] args) throws IOException, TemplateException {
//定義模板的載入路徑
String path = FreeMarkerTest2.class.getResource("/ftl").getPath();
File file = new File(path);
//建立Configuration例項,負責管理設定freemarker的模板載入路徑
Configuration configuration = new Configuration();
configuration.setDirectoryForTemplateLoading(file);
//設定預設字元編碼
configuration.setDefaultEncoding("utf-8");
//通過configuration建立Template例項
Template template = configuration.getTemplate("user2.ftl");
//使用Map物件填充模板
Map<String,String> map = new HashMap<String,String>();
map.put("name","freemarker");
map.put("message","hello,how are you?");
//指定生成html檔案的位置
Writer writer = null;
File file2 = new File("src/main/resources/html"+"\\"+"user.html");
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2)));
//呼叫模板方法,完成合並
template.process(map, writer);
}
}
user2.ftl內容如下:
執行FreeMarkerTest2 會在設定的路徑下生成一個html檔案
目錄結構如下:
html檔案的內容如下:
可以把這個檔案複製到桌面,進行訪問。
如圖:
至此,我初學階段的理解就都在這了。
個人理解有限,如有不正,歡迎各位大佬批評指正。