1、前言html
上一篇 <從如今開始,試着學會用官方文檔去學習一個技術框架> 提倡你們多去從官方文檔學習技術,沒有講到具體的實踐,本篇就拿一個案例具體的說一說,就是FreeMarker,選擇這個框架沒什麼特別的含義,最近要用,就拿這個作個典型。java
2、套路git
上篇文章最後說到技術學習沒有套路,無招勝有招,無招便是有招,解讀一下實際上就是說 自己仍是有些招式套路,可是要靈活運用,不要什麼都往上套,應該忘掉固有的套路,讓其化爲你的一種本能,見招拆招。 程序員
下面就介紹一種常規學習套路給你們,以下圖:github
下面就根據上面的套路結合FreeMarker官網溜一遍,來學習FreeMarker,重點在前4部分,後面兩部分須要一些積累和經驗後才更容易上手,因此本篇不會重點講web
3、實踐面試
3.1 瞭解框架 apache
首先咱們應該瞭解FreeMarker是用來幹什麼的,這時候我看打開官網 https://freemarker.apache.org/ 編程
上圖來自官網首頁上方的導航,依次爲 Home(主頁)、Manual(手冊)、JavaApi(API接口)、Contribute(貢獻)、 Report a Bug(反饋BUG)、 Download(下載) , 單詞不認識,找工具翻譯一下,沒有別的辦法,上篇也提到了。從字面意思理解能夠看出跟咱們有關的就是標紅的那4個,好的來看看首頁的介紹(大部分框架首頁都會有簡要介紹,說明框架的用途):api
這是首頁的兩段介紹,自行翻譯一下,這裏就不在翻譯了,解讀一下,咱們從這兩段內容中能夠獲得以下信息:
(1)這是一個Java模板引擎
(2)用模板語言(FTL)編寫
(3)基本思想:java或其餘編程語言準備數據,FreeMarker顯示數據,配合官方給的圖,更直觀
(4)在模板中,您關注的是如何顯示數據,而在模板以外,您關注的是顯示什麼數據,這也是全部模板引擎解決的核心問題 數據與顯示分離
(5)用於MVC模式,有助於分離Java開發人員和web設計人員,設計人員不會在模板中面對複雜的邏輯,而且能夠在不須要程序員更改或從新編譯代碼的狀況下更改頁面的外觀,這裏就說明了模板的好處,面試問你,爲何用模板技術啊,結合上面的一點就能夠完美回答這個問題了
(6)不依賴Servlet,也就是web環境和非Web環境均可以使用
(7)更多細節內容看 manual (手冊)
經過解讀官方的文檔,咱們就能夠獲得以上7個方面的信息。也就瞭解了Freemarker的做用、基本思想、好處、應用環境,這些東西,相信在不少FreeMarker的教程中,都不會這麼詳細,並且上面的信息基本上只要你把英文翻譯過來均可以直觀看到,我並無作太多總結性概括。 這是基本內容,首頁還標出了一些特性咱們再來看一下
解讀一下獲得的信息以下
(1)強大的模板語言,支持條件塊、迭代、賦值、字符串和算術操做等
(2)零依賴,任何輸出格式,能夠從任何地方加載模板
(3)支持國際化
(4)支持xml數據模型,也就是能夠將xml數據填充到模板上
(5)支持java對象暴露在模板,簡單理解模板中能夠調用對象的方法
結合上面的基本內容和特性部分的內容,相信你們對freemarker有了較爲完整的認識,包括能不能知足本身的一些場景,也會有一些基本的判斷,方便技術選型。
3.2 Helloworld
看完基本內容,有了大體瞭解後,是否是火燒眉毛想去敲代碼試一下,小階段的輸出成果更容易促使學習的動力。看文檔首頁顯然沒有告訴咱們怎麼用,怎麼去開始寫代碼,但提到了更多內容看manual,那咱們就點到manual去看一下
從這裏我看看到了Getting Started(開始),大部分的官網都會有Getting Started,點進去看一下,這裏要多作一件事,寫代碼確定要使用freemarler的jar,咱們就從download去拿一下,進到download
能夠看到,咱們能夠直接下freemarker.jar、源碼,或者經過maven引入,這裏你們隨意,導入工程,而後回到剛纔的地方,看quick start
三塊內容
(1)模板 + 數據模型 = 輸出
(2)一睹數據模型
(3)一睹模板
分別點進去看一下,能夠了解到
(1) 模板有表達式和指令
(2) 數據模型是樹形結果
可是咱們沒有看到代碼,只看到一段模板代碼和最終的結果輸出,這裏沒有怎麼辦?咱們再掃一眼目錄,發現這裏還有個Getting Started(一些框架官網沒有直接給demo,咱們能夠去框架託管代碼(github、gitee)的地方去找一下,基本上都會有demo)
而後看一下它的分類是 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首頁,找配置相關的字眼,發現
就是它了吧,大概點進去看一下
更多的圖就不貼了,總之咱們指導這裏就是介紹配置屬性的地方,詳細內容你們本身看一看,這裏有一個比較重要的點就是模板加載器,你們本身查閱熟悉一下。
3.4 更多API
熟悉完配置,咱們須要瞭解一些API的使用,這裏就不展開了,點到javaApi,自行查閱,這裏就不展開說明了。
3.4 表達式、指令
這裏的內容在上面的套路圖中沒標,那個圖我表達的是一個通用的套路,這裏算套路圖中[更多基礎API]一種吧。
表達式、指令是對與模板來講的,也就是輸出數據的一些命令。瀏覽文檔相關內容找模板、表達式、指令相關的關鍵字,就能夠鎖定相關內容主要在
單純的表達式、指令使用都很簡單,這裏很少講了。
3.5 高級用法
所謂高級用法也就是一些提高性能的配置、自定義擴展、一些指令、表達式之類的,這須要你們熟悉基本的使用、配置、api和文檔的相關介紹。這裏暫不展開,相信有了前面的基礎掌握一些技巧和方法,這裏來講不是難事。
3.6 原理、源碼
這裏針對有興趣,想深刻學習的人,寫到這是爲了保證套路的完整性,這裏也不展開,也不是本篇內容的重點。
4、總結
本篇重點是帶你們從官網去學習一個技術框架,至少用到一些配置、api知道怎麼去查,要學習一個新技術的時候大概須要怎麼作,還提了一個基本的學習套路,但願能給須要的人一些幫助。
沒看上一篇的建議看一下。
Over。