posts - 176, comments - 240, trackbacks - 0, articles - 7

          [導入]tpl與FreeMarker的標簽對比

          Posted on 2005-12-12 22:18 canonical 閱讀(1783) 評論(2)  編輯  收藏 所屬分類: Witrix開發平臺

          witrix平臺中的tpl模板技術是一種通用的xml動態標簽技術,不僅可以用于文本生成,而且可以用于任何需要動態標簽的地方,例如工作流引擎 的配置和執行腳本。tpl模板引擎采用的不是jsp tag的標準機制,而是重新設計并實現的。在開發的后期,因為jstl標準出現,我們對標簽的命名作了一定的修改,以盡量符合標準的調用接口。tpl模板 語言完全符合xml規范,其標簽定義都是完全獨立開發的。在開發tpl的時候,我們甚至沒有看到任何類似于c:forEach和c:if的標簽設計。但是 我們發現,tpl的動態處理功能與jstl雖然命名不同,但是基本是等價的,所以修改是非常直接的過程。

          FreeMarker是一種流 行的文本模板語言,其語法類似于xml tag,但是命名規則不同。這實在是一種令人費解的設計。有意思的是,我們發現tpl的功能集也包含了FreeMarker的功能集。這實際上表明了一件 事情,xml動態標簽存在一些必然的功能需求,無論是jsp tag, FreeMarker還是tpl, 所不同的只是表現形式而已。但這種表現形式的差異卻又造成了實際功能上的巨大差異。

          tpl與FreeMarker具體對比如下。

          宏定義
          <#macro greet person>
          <font size="+2">Hello ${person}</font>
          </#macro>]]>

          <c:lib namespace="test">
          <greet demandArgs="person">
          <font size="+2">Hello ${person}</font>
          </greet>
          </c:lib>

          tpl具有更加強大的變量域控制手段,可以通過importVars參數來指定是否使用調用環境中的變量作為缺省參數。另一方面,tpl具有更加靈活的參數校驗規則,可以通過demandArgs, otherArgs等參數來指定對自定義標簽參數的校驗規則。
          調用宏
          <@greet person="Fred" />
          <test:greet person="Fred" />

          嵌套內容
          <#macro border>
          <table border="4" cellspacing="0" cellpadding="4"><tr><td>
          <#nested>
          <#nested>
          </tr></td></table>
          </#macro>
          <c:lib namespace="test">
          <border type="bodyTag">
          <table border="4" cellspacing="0" cellpadding="4"><tr><td>
          <cp:compile src="${tagBody}" />
          </tr></td></table>
          </border>
          </c:lib>

          tpl的<cp:compile>指令在執行時可以指定xslt參數,從而在編譯tagBody之前應用xslt變換。
          復雜嵌套
          與FreeMark一樣,嵌套內容可以是復雜內容

          <@border>
          <ul>
          <@do_thrice>
          <li><@greet person="Joe"/>
          /@do_thrice
          </ul>
          /@border
          <test:border>
          <ul>
          <test:do_thrice>
          <li><test:greet person="Joe" /></li>
          </test:do_thrice>
          </ul>
          </test:border>

          導入庫
          <#import "/lib/my_test.ftl" as my>
          <c:lib src="/lib/my_test.ftl" namespace="my" />

          創建或替代變量
          <#assign mail="jsmith@other.com" />
          <c:set var="mail" value="jsmith@other.com" default="xx"/>

          判斷
          <#if animals.python.price < animals.elephant.price>
          Pythons are cheaper than elephants today.
          </#if>
          <c:if test="${lt(animals.python.price,animals.elephant.price)}">
          Pythons are cheaper than elephants today.
          </c:if>

          tpl因為是xml語法,算術操作符<和>必須轉義后才能使用,使用起來很不方便,因而最終決定tpl不支持操作符,通過lt(), gt()等函數來實現功能。
          循環
          <#list animals as being>
          <tr><td>${being.name}<td>${being.price} Euros
          </#list>
          <c:forEach var="being" items="${animals}" >
          <tr><td>${being.name}<td>${being.price} Euros
          </c:forEach>

          tpl提供<c:tile>等多種循環方式
          include指令
          <#include "/copyright_footer.html">
          <c:include src="/copyright_footer.html" />

          tpl強大的模板功能加上jsplet框架面向對象的能力,使得我們可以輕易的封裝復雜的界面組件。而且這種封裝能力還不需要Tapestry那種復雜的配置文件。tpl對portal應用的支持也是一個自然的發展過程。

          Feedback

          # re: [導入]tpl與FreeMarker的標簽對比  回復  更多評論   

          2005-12-14 12:01 by nighthawk
          witrix有沒有打算開源

          # re: [導入]tpl與FreeMarker的標簽對比  回復  更多評論   

          2005-12-14 14:27 by canonical
          沒有這樣的計劃
          主站蜘蛛池模板: 班玛县| 黄梅县| 军事| 商河县| 宁安市| 威远县| 上栗县| 松阳县| 岳池县| 依兰县| 绥芬河市| 聊城市| 奉化市| 三台县| 张掖市| 郧西县| 贵南县| 横山县| 滦南县| 景东| 滨州市| 五华县| 永福县| 治多县| 襄垣县| 玉门市| 南岸区| 永安市| 藁城市| 沧州市| 子长县| 三台县| 闽清县| 林周县| 鄂州市| 静宁县| 吴桥县| 金山区| 勐海县| 米林县| 拉萨市|