91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

freemark 應用以及優勢

發布時間:2020-08-06 18:43:38 來源:網絡 閱讀:488 作者:sdfjkhsdk 欄目:開發技術

在B/S程式設計中,常常有美工和程序員二個角色,他們具有不同專業技能:美工專注于表現——創建頁面、風格、布局、效果等等可視元素;而程序員則忙于創建程式的商業流程,生成設計頁面要顯示的數據等等。很多時候,要顯示的資料在設計的時候并不存在,它們一般是在運行時由程式產生的,比如執行“價格不高于800NT的USB Disk”查詢的返回結果。這種技術需求產生了JSP等Scriptlet,JSP十分強大,但是也常常被濫用,并導致一些不良的后果

將邏輯和表現混合在一起。
破壞了美工和程序員職責的正常分解。
使JSP頁面難以閱讀和維護。
模板引擎就是為了解決上面的問題而產生的。在設計HTML的時候,我們加入一些特定指令來指定要插入哪些數據,這些加了特殊指令的HTML或者其他文本,我們稱為模板(Template)。而模板引擎會在輸出頁面時,用適當的數據替代這些代碼。
模板和嵌入JSP的HTML是不同的,模板指令只有很有限的編程能力,可以避免混入商業邏輯。
三萬英尺俯瞰FreeMarker
簡單的說,FreeMarker就是一種用Java編寫的模板引擎,它根據模板輸出多種規格的文本。特別指出的是,FreeMarker與Web應用框架無關,它同樣可以應用在非Web應用程序環境中。

下面我們來看看FreeMarker的模板:(product.ftl)

<html>

<head>

<title>Welcome!</title>

</head>

<body>

<h2>Welcome ${user}!</h2>

<p>Our latest product:

<a href="${latestProduct.url}"
>${latestProduct.name}</a>!

</body>

</html>
這個例子是在簡單的HTML中加入了一些由${…}包圍的特定代碼,這些特定代碼就是FreeMarker的指令。

至于user、latestProduct.url和latestProduct.name的具體內容則來自于數據模型(data model)。數據模型由程序員編程來創建,向模板提供變化的信息,這些信息來自于數據庫、文件,甚至于在程序中直接生成。

模板設計者不關心數據從那兒來,只知道使用已經建立的數據模型。

借助FMPP(FreeMarker PreProcessor)來運行FreeMarker
首先說明的是FreeMarker的運行并不依賴于FMPP。FMPP只是一個FreeMarker的輔助工具,有了它,我們可以快速地調試FreeMarker輸出結果,而不需要借助Java編程,這可以大大地減輕美工設計人員的調試難度。

在磁盤上建立相關的文件夾:

D:/work/src/product.ftl

D:/work/out/

D:/work/data/product.tdd

D:/work/config.fmpp
我們使用的配置文件(config.fmpp)設置如下:

sourceRoot: src

outputRoot: out

logFile: log.fmpp

modes: [

copy(common/**/*.*, resource/*.*)

execute(*.ftl)

ignore(templates/*.*, .project, **/*.xml, xml/*.*, *.js)

]

replaceExtensions: [ftl, html]

sourceEncoding: gb2312

data: tdd(../data/product.tdd)
注意:"data: tdd(../data/product.tdd)" 指定了模板的數據源,TDD是fmpp支持的數據格式之一 ,關于TDD介紹可參閱fmpp文檔,也可參看TDD 。product.tdd內容是這樣的:

{

user: "Big Joe"


latestProduct: {url: "products/greenmouse.html"
, name: "Green Mouse"


}
現在在dos下執行(假設FMPP安裝在D:/FMPP下):

D:/work/>D:/FMPP/bin/fmpp
最后的輸出結果是這樣的,存放在文件out/product.html中:

<html>

<head>

  <title>Welcome!</title>

</head>

<body>

  <h2>Welcome Big Joe!</h2>

  <p>Our latest product:

  <a href="products/greenmouse.html"
>green mouse</a>!

</body>

</html>
正如FreeMarker文檔中所敘述的,FreeMarker的工作原理就是:

模板+數據=輸出!

FreeMarker并不局限于生成html,甚至可以產生java代碼,這僅僅取決于你如何設計模板而已。

現在有了FMPP這個強大工具,我們接下來可以快速學習FreeMarker的相關指令。let us go!

在FreeMarker模板中使用的三種基本對象類型:Scalars、Hashes 和Sequences。在解釋這些對象類型之前,我們先來看看數據模型。

典型的數據模型是樹型結構,可以有任意深的層次,比如說:

(root)

  |

  +- animals

  |   |

  |   +- mouse

  |   |   |   

  |   |   +- size = "small"


  |   |   |   

  |   |   +- price = 50

  |   |

  |   +- elephant

  |   |   |   

  |   |   +- size = "large"


  |   |   |   

  |   |   +- price = 5000

  |   |

  |   +- python

  |       |   

  |       +- size = "medium"


  |       |   

  |       +- price = 4999
這棵樹上的每一片葉子在FreeMarker中就稱為Scalars,用來存儲單值。Scalars保存的值 有兩種類型:字符串(用引號括起,可以是單引 號或雙引號)、數字(不要用引號將數字括起,這會作為字符串處理)、日期和boolean值。對scalars的訪問要從root開始,各部分用“.”分 隔,如animals.mouse.price。

樹的每一個分支關聯一個唯一的查詢名字,例如“mouse”,“elephant”,這些分支充當了其他對象(size,price)的容器,這種結構則稱為Hashes,參考Hashes的TDD定義 。

Sequences的作用與Hashes類似,也可以充當其它對象的容器,只是不使用變量名字,而使用數字索引:

(root)

  |

  +- animals

  |   |

  |   +- (1st)

  |   |   |

  |   |   +- name = "mouse"


  |   |   |

  |   |   +- size = "small"


  |   |   |

  |   |   +- price = 50

  |   |

  |   +- (2nd)

  |   |   |

  |   |   +- name = "elephant"


  |   |   |

  |   |   +- size = "large"


  |   |   |

  |   |   +- price = 5000

  |   |

  |   +- (3rd)

  |       |

  |       +- name = "python"


  |       |

  |       +- size = "medium"


  |       |

  |       +- price = 4999
可以通過animals[0].name來訪問相應的Scalars。參考Sequences的TDD定義

針對上面三種對象類型的操作,可以參看對象類型的各種操作

模板與指令
除了相關的文本外,在FreeMarker模板中可以包括下面三種特定部分:

${…}:稱為插補(interpolations),FreeMarker會在輸出時用實際值進行替代。
指令:也叫FreeMarker標記,與HTML標記類似,但用#開始(有些以@開始 ,在后面敘述)。
注釋:包含在<#-- 和 -->(而不是<!--和-->)之間文本。
控制指令
if指令
if指令與大部分程式語言一樣,也支持<#else if..>,不再贅述。

<#if
animals.python.price < animals.elephant.price>

  Pythons are cheaper than elephants today.

<#else
>

  Pythons are not cheaper than elephants today.

</#if
>
list指令
list指令將遍歷Sequences里的每一個元素。list指令有兩個隱含的特殊變量:

item_index 該變量將返回元素在Sequences里的索引值。
item_has_next 該變量是boolean型,false表明該元素是Sequences里的最后一個元素。
<p>We have these animals:

<table border=1>

  <tr><th>Id<th>Name<th>Price

  <#list animals as being>

  <tr><td>${being_index+1}<td>${being.name}<td>${being.price} Euros

  </#list>

</table>
上面的模板可以依次列印出三種動物的名字和價格,being_index和being_has_next則是它的特殊變量。

可以用<#break>指令提前結束list循環。

switch指令
與其他語言的switch語句類似。

<#switch
being.size>

  <#case
"small"
>

     This will be processed if
it is small

     <#break
>

  <#case
"medium"
>

     This will be processed if
it is medium

     <#break
>

  <#case
"large"
>

     This will be processed if
it is large

     <#break
>

  <#default
>

     This will be processed if
it is neither

</#switch
>
注意事項
FTL區分大小寫,所以list是正確的FTL指令,而List不是;${name}和${NAME}是不同的
Interpolation只能在文本中使用
FTL標記不能位于另一個FTL標記內部。
注釋可以位于FTL標記和Interpolation內部。
多余的空白字符會在模板輸出時移除
可用[#if..]來替代<#if..>,避免于HTML標記混淆。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海淀区| 鹤壁市| 静乐县| 兴安县| 亚东县| 贡觉县| 牟定县| 辰溪县| 农安县| 伊吾县| 兴安县| 大宁县| 汕尾市| 东乌珠穆沁旗| 互助| 彰化县| 郑州市| 游戏| 仙居县| 蓬安县| 阿图什市| 东乡县| 定安县| 泽普县| 馆陶县| 务川| 札达县| 志丹县| 墨江| 惠来县| 治县。| 常宁市| 绥中县| 新疆| 乾安县| 静海县| 昂仁县| 昌邑市| 北安市| 托里县| 武汉市|