博客 / 詳情

返回

從官方文檔去學習之FreeMarker

一、前言

上一篇 <從現在開始,試着學會用官方文檔去學習一個技術框架> 提倡大家多去從官方文檔學習技術,沒有講到具體的實踐,本篇就拿一個案例具體的説一説,就是FreeMarker,選擇這個框架沒什麼特別的含義,最近要用,就拿這個做個典型。

二、套路

上篇文章最後説到技術學習沒有套路,無招勝有招,無招即是有招,解讀一下實際上就是説 本身還是有些招式套路,但是要靈活運用,不要什麼都往上套,應該忘掉固有的套路,讓其化為你的一種本能,見招拆招。 

下面就介紹一種常規學習套路給大家,如下圖:
clipboard.png

下面就根據上面的套路結合FreeMarker官網溜一遍,來學習FreeMarker,重點在前4部分,後面兩部分需要一些積累和經驗後才更容易上手,所以本篇不會重點講

三、實踐

3.1  瞭解框架 

首先我們應該瞭解FreeMarker是用來幹什麼的,這時候我看打開官網 https://freemarker.apache.org/ 

clipboard.png

上圖來自官網首頁上方的導航,依次為 Home(主頁)、Manual(手冊)、JavaApi(API接口)、Contribute(貢獻)、 Report a Bug(反饋BUG)、 Download(下載) , 單詞不認識,找工具翻譯一下,沒有別的辦法,上篇也提到了。從字面意思理解可以看出跟我們有關的就是標紅的那4個,好的來看看首頁的介紹(大部分框架首頁都會有簡要介紹,説明框架的用途):

clipboard.png

clipboard.png

      
這是首頁的兩段介紹,自行翻譯一下,這裏就不在翻譯了,解讀一下,我們從這兩段內容中可以得到如下信息:

(1)這是一個Java模板引擎
(2)用模板語言(FTL)編寫
(3)基本思想:java或其他編程語言準備數據,FreeMarker顯示數據,配合官方給的圖,更直觀
clipboard.png
(4)在模板中,您關注的是如何顯示數據,而在模板之外,您關注的是顯示什麼數據,這也是所有模板引擎解決的核心問題 數據與顯示分離
(5)用於MVC模式,有助於分離Java開發人員和web設計人員,設計人員不會在模板中面對複雜的邏輯,並且可以在不需要程序員更改或重新編譯代碼的情況下更改頁面的外觀,這裏就説明了模板的好處,面試問你,為什麼用模板技術啊,結合上面的一點就可以完美回答這個問題了
(6)不依賴Servlet,也就是web環境和非Web環境都可以使用
(7)更多細節內容看 manual (手冊)

通過解讀官方的文檔,我們就可以得到以上7個方面的信息。也就瞭解了Freemarker的作用、基本思想、好處、應用環境,這些東西,相信在很多FreeMarker的教程中,都不會這麼詳細,而且上面的信息基本上只要你把英文翻譯過來都可以直觀看到,我並沒有做太多總結性歸納。 這是基本內容,首頁還標出了一些特性我們再來看一下

clipboard.png

解讀一下得到的信息如下

(1)強大的模板語言,支持條件塊、迭代、賦值、字符串和算術操作等
(2)零依賴,任何輸出格式,可以從任何地方加載模板
(3)支持國際化
(4)支持xml數據模型,也就是可以將xml數據填充到模板上
(5)支持java對象暴露在模板,簡單理解模板中可以調用對象的方法

結合上面的基本內容和特性部分的內容,相信大家對freemarker有了較為完整的認識,包括能不能滿足自己的一些場景,也會有一些基本的判斷,方便技術選型。

3.2 Helloworld

看完基本內容,有了大致瞭解後,是不是迫不及待想去敲代碼試一下,小階段的輸出成果更容易促使學習的動力。看文檔首頁顯然沒有告訴我們怎麼用,怎麼去開始寫代碼,但提到了更多內容看manual,那我們就點到manual去看一下

clipboard.png

從這裏我看看到了Getting Started(開始),大部分的官網都會有Getting Started,點進去看一下,這裏要多做一件事,寫代碼肯定要使用freemarler的jar,我們就從download去拿一下,進到download

clipboard.png

可以看到,我們可以直接下freemarker.jar、源碼,或者通過maven引入,這裏大家隨意,導入工程,然後回到剛才的地方,看quick start

三塊內容

(1) 模板 + 數據模型 = 輸出
(2) 一睹數據模型
(3) 一睹模板

分別點進去看一下,可以瞭解到

(1) 模板有表達式和指令
(2) 數據模型是樹形結果

但是我們沒有看到代碼,只看到一段模板代碼和最終的結果輸出,這裏沒有怎麼辦?我們再掃一眼目錄,發現這裏還有個Getting Started(一些框架官網沒有直接給demo,我們可以去框架託管代碼(github、gitee)的地方去找一下,基本上都會有demo)

clipboard.png

然後看一下它的分類是 Programmer's Guide(程序員指南),那就應該是這裏了,點進去看一下,可以看到,除過最後最後的 Putting all together, 其他部分是使用模板的每一個步驟,分為:創建配置實例 -> 創建數據模型 -> 獲取模板 -> 合併數據模型到模板,這也是使用freemaker的基本步驟,分步驟的就不看了,我們直接看最後的Putting all together(所有合到一起的內容)

測試類

import freemarker.template.*;
import java.util.*;
import java.io.*;

public class Test {

    public static void main(String[] args) throws Exception {

        /* ------------------------------------------------------------------------ */
        /* You should do this ONLY ONCE in the whole application life-cycle:        */

        /* Create and adjust the configuration singleton */
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_27);
        cfg.setDirectoryForTemplateLoading(new File("/where/you/store/templates"));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        cfg.setLogTemplateExceptions(false);
        cfg.setWrapUncheckedExceptions(true);

        /* ------------------------------------------------------------------------ */
        /* You usually do these for MULTIPLE TIMES in the application life-cycle:   */

        /* Create a data-model */
        Map root = new HashMap();
        root.put("user", "Big Joe");
        Product latest = new Product();
        latest.setUrl("products/greenmouse.html");
        latest.setName("green mouse");
        root.put("latestProduct", latest);

        /* Get the template (uses cache internally) */
        Template temp = cfg.getTemplate("test.ftlh");

        /* Merge data-model with template */
        Writer out = new OutputStreamWriter(System.out);
        temp.process(root, out);
        // Note: Depending on what `out` is, you may need to call `out.close()`.
        // This is usually the case for file output, but not for servlet output.
    }
}

數據模型

/**
 * Product bean; note that it must be a public class!
 */
public class Product {

    private String url;
    private String name;

    // As per the JavaBeans spec., this defines the "url" bean property
    // It must be public!
    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    // As per the JavaBean spec., this defines the "name" bean property
    // It must be public!
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

模板 test.ftlh

<html>
<head>
  <title>Welcome!</title>
</head>
<body>
  <h1>Welcome ${user}!</h1>
  <p>Our latest product:
  <a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>

相信不出意外,複製粘貼到自己的工程裏,就可以正常運行了,至此一個helloworld就算OK了,對於代碼的含義,可以直接查javaApi, 可以看分步驟的內容有解釋。

至此我們對freemarker應該有了更直觀的認識和理解,也基本知道了使用的套路

3.3  熟悉配置

為什麼要熟悉配置,很多框架的功能支持、 性能調優實際上做的就是配置參數的調整,所以説比較重要,我們來看一下,回到manual首頁,找配置相關的字眼,發現

clipboard.png

就是它了吧,大概點進去看一下

clipboard.png

更多的圖就不貼了,總之我們指導這裏就是介紹配置屬性的地方,詳細內容大家自己看一看,這裏有一個比較重要的點就是模板加載器,大家自己查閲熟悉一下。

3.4  更多API

熟悉完配置,我們需要了解一些API的使用,這裏就不展開了,點到javaApi,自行查閲,這裏就不展開説明了。

3.4  表達式、指令

這裏的內容在上面的套路圖中沒標,那個圖我表達的是一個通用的套路,這裏算套路圖中[更多基礎API]一種吧。

表達式、指令是對與模板來説的,也就是輸出數據的一些命令。瀏覽文檔相關內容找模板、表達式、指令相關的關鍵字,就可以鎖定相關內容主要在

clipboard.png

單純的表達式、指令使用都很簡單,這裏不多講了。

3.5  高級用法

所謂高級用法也就是一些提升性能的配置、自定義擴展、一些指令、表達式之類的,這需要大家熟悉基本的使用、配置、api和文檔的相關介紹。這裏暫不展開,相信有了前面的基礎掌握一些技巧和方法,這裏來説不是難事。

3.6  原理、源碼

這裏針對有興趣,想深入學習的人,寫到這是為了保證套路的完整性,這裏也不展開,也不是本篇內容的重點。

四、總結

本篇重點是帶大家從官網去學習一個技術框架,至少用到一些配置、api知道怎麼去查,要學習一個新技術的時候大概需要怎麼做,還提了一個基本的學習套路,希望能給需要的人一些幫助。

沒看上一篇的建議看一下。

Over。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.