隨筆-112  評論-73  文章-0  trackbacks-0

          轉(zhuǎn)自:http://fhd001.iteye.com/blog/1167764

          freemarker之模板開發(fā)(其它之自定義指令)

          ----------

          自定義指令可以使用macro指令來定義,這是模板設(shè)計者所關(guān)心的內(nèi)容。Java程序員若不想在模板中實(shí)現(xiàn)自定義指令,而是在java語言中實(shí)現(xiàn)指令的定義,這時可以使用:freemarker.template.TemplateDirectiveModel類來擴(kuò)展。

          ? ?

          宏是有一個變量名的模板片段。你可以在模板中使用宏作為自定義指令,這樣就能進(jìn)行重復(fù)性的工作。

          如例:

          Html代碼??

          1. <#macro?greet>??
          2. ????<font?size="+2">Hello?Joe!</font>??
          3. </#macro>??

          macro指令自身不打印任何內(nèi)容,它只是用來創(chuàng)建宏變量,所以就會有一個名為greet的變量,<#macro greet></#macro>之間的內(nèi)容(稱為宏定義體)當(dāng)使用它作為指令時將會被執(zhí)行。你可以在FTL標(biāo)記中通過@代替#來使用自定義指令使用變量名作為指令名。而且,自定義指令的結(jié)束標(biāo)記也是需要的,如:<@greet></@greet>

          因?yàn)?/span><anything>,/anything><anything/>是相同的,你也可以使用:<@greet/>

          宏能做的事情還有很多,因?yàn)樵?/span><#macro...></#macro>之間的東西是模板片段,也就是說它可以包含插值(${..})FTL標(biāo)簽(如:<#if...>...</#if>)

          注意:程序員通常將使用<@...>,這稱為宏調(diào)用

          ? ?

          參數(shù)

          macro指令中,宏名稱的后面位置是用來定義變量的。如例:?

          Html代碼??

          1. <#macro?greet?person>??
          2. ????<font?size="+2">Hello?${person}!</font>??
          3. </#macro>??

          那么就可以這樣來使用這個宏:

          Html代碼??

          1. <@greet?person="Fred"/>??

          使用預(yù)定義指令時,參數(shù)的值(=號后邊的值)可以是FTL表達(dá)式。這樣,不像HTML"Fred"的引號就可以不用要了。<@greet person=Fred/>也意味著使用變量的值Fred作為person參數(shù),而不是字符串"Fred"。當(dāng)然參數(shù)值并不一定是字符串類型,也可以是數(shù)字,布爾值,哈希表,序列等...也可以在=號左邊使用復(fù)雜表達(dá)式(比如:someParam=(price+50)*1.25)

          自定義指令可以有多個參數(shù),如: ?

          Html代碼??

          1. <#macro?greet?person?color>??
          2. ????<font?size="+2"?color="${color}">Hello?${persion}!</font>??
          3. </#macro>??

          那么,這個宏就可以這樣來使用:

          Html代碼??

          1. <@greet?person="Fred"?color="black"/>??

          同時也必須給出在宏中定義所有參數(shù)的值。如果你嘗試<@greet person="Fred"/>時也會發(fā)生錯誤,因?yàn)橥浿付?/span>color的值了。?

          根據(jù)FTL表達(dá)式規(guī)則,明白下面這一點(diǎn)是至關(guān)重要的,someParam=foosomeParam="${foo}"是不同的。第一種情況,是把變量foo的值作為參數(shù)的值來使用。第二種情況則是使用插值形式的字符串,那么參數(shù)值就是字符串了,這個時候,foo的值呈現(xiàn)為文本,而不管foo是什么類型的

          宏參數(shù)的另外一個重要的方面是它們是局部變量。

          ? ?

          嵌套內(nèi)容

          自定義指令可以嵌套內(nèi)容,和預(yù)定義指令相似。如:?

          Html代碼??

          1. <#macro?border>??
          2. ????<table?border=4?cellspacing=0?cellpadding=4><tr><td>??
          3. ????????<#nested>??
          4. ????</td></tr></table>??
          5. </#macro>??

          注:<#nested>指令執(zhí)行位于開始和結(jié)束標(biāo)記指令之間的模板代碼段。如果這樣寫:

          Html代碼??

          1. <@border>The?bordered?text</@border>??

          那么就會輸出:

          Html代碼??

          1. <table?border=4?cellspacing=0?cellpadding=4><tr><td>??
          2. ????The?bordered?text??
          3. </td></tr></table>??

          如果不使用nested指令,那么嵌套的內(nèi)容就不會被執(zhí)行,前面的例子如果這樣寫:

          Html代碼??

          1. <@greet?person="Joe">??
          2. ????Anything.??
          3. </@greet>??

          FreeMarker不會把它視為錯誤,只是打印:

          Html代碼??

          1. <font?size="+2">Hello?Joe!</font>??

          嵌套的內(nèi)容被忽略了,因?yàn)?/span>greet宏沒有使用nested指令。

          ? ?

          宏和循環(huán)變量

          list這樣的預(yù)定義指令可以使用循環(huán)變量,如例:

          Html代碼??

          1. <#macro?do_thrice>??
          2. ????<#nested?1>??
          3. ????<#nested?2>??
          4. ????<#nested?3>??
          5. </#macro>??

          用戶自定義指令,使用";"代替"as"

          Html代碼??

          1. <@do_thrice?;?x>??
          2. ????${x}?Anything.??
          3. </@do_thrice>??

          將會輸出:

          1 Anything.

          2 Anything.

          3 Anything.

          nested指令(當(dāng)然參數(shù)可以是任意的表達(dá)式)的參數(shù),循環(huán)變量的名稱是在自定義指令的開始標(biāo)記(<@...>)的參數(shù)后面通過分號確定的。

          posted on 2012-06-21 10:04 Libo 閱讀(772) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 周口市| 吴川市| 隆尧县| 老河口市| 余姚市| 岑巩县| 萨嘎县| 晋中市| 永宁县| 那曲县| 楚雄市| 巴东县| 兴化市| 澎湖县| 册亨县| 金山区| 顺义区| 弋阳县| 余干县| 海原县| 合肥市| 古蔺县| 巨鹿县| 青田县| 金昌市| 泊头市| 蒙阴县| 元谋县| 寿阳县| 兴安盟| 贵溪市| 昌邑市| 灵山县| 盐津县| 勐海县| 永兴县| 贵溪市| 安国市| 永登县| 平邑县| 苏尼特右旗|