1. 程式人生 > >freemarker簡介及入門demo

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檔案的內容如下:

可以把這個檔案複製到桌面,進行訪問。

如圖:

至此,我初學階段的理解就都在這了。

個人理解有限,如有不正,歡迎各位大佬批評指正。