1.模板+數據模型=輸出html
一個簡單的HTML頁面:python
<html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome Beijing!<h1> <p>Hello World!: <a href="abc/helloworld.html">hello world</a> </body> </html>
freemarker使用模板來代替靜態的HTML文本。模板文件一樣是靜態的HTML代碼,可是除了這些HTML代碼外,代碼中還包括了一些freemarker指令元素,指令元素可以作到動態效果。程序員
<html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome ${user}!</h1> <p>Hello World!: <a href="${helloworld.url}">${helloworld.name}</a> </body> </html>
這個模板存放在Web服務器上,看上去像是靜態的HTML頁面。但無論什麼時候,只要有人來訪問這個頁面,freemarker將會介入執行,而後動態轉換模板,用最新的數據內容替換模板中${...}的部分,生成普通的HTML文本併發送結果到訪問者的Web瀏覽器中去顯示。因此訪問者的Web瀏覽器會接收到相似於第一個HTML示例的內容(也就是說,顯示普通的HTML文本而沒有freemarker的指令),由於瀏覽器也不會感知到freemarker在服務器被調用了。模板文件自己(存儲在Web服務器端的文件)在這個過程當中也不會改變什麼,因此這個轉換過程發生在一次又一次的訪問中。這樣就保證了顯示的信息老是及時的。數組
歸納的講,模板和數據模型是freemarker所需,並用來生成輸出內容的:模板+數據模型=輸出瀏覽器
2.數據模型一覽服務器
上圖中變量扮演目錄的角色(根root,animal,mouse,elephant,python,whatnot)被稱爲hash哈希表。哈希表經過可查找的名稱(例如:「animal」,「mouse」,「price」)來訪問存儲的其餘變量(如子變量)。併發
若是僅存儲單值的變量(size,price,text和because)則它們被稱爲scalars標量。ui
若是要在模板中使用子變量,那應該從根root開始指定它的路徑,每級之間用點來分隔。要訪問price和mouse的話,應該從根開始,先是animals,而後是mouse,最後是price,因此應該這樣寫:animals.mouse.price。當放置${...}這種特定代碼在表達式的先後時,咱們就告訴freemarker在那個位置上要來輸出對應的文本。url
sequences序列也是一種很是重要的變量 ,它們和哈希表變量類似,可是它們不存儲所包含變量的名稱,而是按順序存儲子變量。這樣,就可使用數字索引來訪問這些子變量。在這種數據模型中,animal和whatnot。fruits就是序列:scala
可使用數組的方括號方式來訪問一個序列的子變量。索引從零開始(從零開始是程序員寫代碼的傳統習慣),那麼就意味着序列第一項的索引是0,第二項的索引是1,並以此類推。要獲得第一個動物名稱的話,那麼就應該這麼寫代碼:animals[0].name。要獲得whatnot.fruits(就是「banana」這個字符串)的第二項,那麼就應該這麼來寫:whatnot.fruits[1]。
標量能夠分爲以下類別:
字符串:這是文本類型,字符的任意序列,好比「m」,「o」,「u」,「s」,「e」這些,並且name-s和size-s也是字符串範疇。
數字:這是數字值類型,好比price-s這些。在freemarker中字符串「50」和數字50是兩種徹底不一樣的類型。前者只是兩個字符的序列(這剛好是咱們能夠讀的一個數字),然後者是一個能夠在算術運算中直接被使用的數值。
日期/時間:這是時間日期類型。例如動物被捕捉的日期,或商店開始營業的時間。
布爾值:對應對/錯(是/否,開/關等)這樣僅僅表明正反的值。好比動物能夠有一個受保護(protected)的子變量,這個變量存儲這個動物是否被保護起來。
總結:
數據模型能夠被看作是樹狀結構的。
標量存儲單一的值,這種類型的值能夠是字符串,數字,日期/時間或者是布爾值。
哈希表是存儲變量和與其相關且有惟一標識名稱變量的容器。
序列是存儲有序變量的容器。存儲的變量能夠經過數字索引來檢索,索引一般從零開始。