Posted on 2005-11-22 23:09
canonical 阅读(1017)
评论(0) 编辑 收藏 所属分类:
Witrix开发平台
witrix平台中的tpl模板技术的重点在于标签定义的设计, 在于如何最大限度的发挥xml格式的表达能力。
tpl自定义标签的基本结构如下:
<Namespace:TagName tpl:tag="realTagName"
tpl:noborder="${booleanExprInCompileContext}"
tpl:ignore="${booleanExprInCompileContext}"
attrName="stringOrExpression" cp:attributeInCompileContext="atringOrExpression"
OtherNamespace:OtherAttrName="stringOrExpression"
>
bodyContent
</NameSpace:TagName>
自定义标签总是处在某一名字空间中, tpl名字空间中的属性由tpl编译器负责进行解析并处理,
而cp名字空间中的属性在编译期能够访问,其他名字空间的属性被完全忽略,
一般只有decorator会识别这些属性(例如cache:timeout).所有无名字空间的属性都相当于是自定义标签的调用参数,在标签运行的时候
可以在标签内部访问到。
tpl通过对namespace的使用, 避免了系统属性, decorator属性与普通标签属性之间的相互干扰, 这与JSF和Tapestry都是不同的。
tpl:tag属性指定此标签在编译时对应的真实标签名,
即编译期会识别RealTagName而不是Namespace:TagName。tpl:noborder为true的时候相当于是直接编译
bodyContent, 例如用来在编译期控制是否在界面上使用某种边框。
tpl:ignore为true的时候,此标签将被忽略而不会被编译。
bodyContent在编译期成为tagBody变量, 由自定义标签自己决定如何处理,
这种方式比FreeMarker的<#nested>机制要灵活和强大的多. 例如在标签内部我们可以使用<cp:compile
src="${tagBody}" /> 这等价于 FreeMarker的<#nested>. 也可以使用
<cp:compile
src="${tagBody.existingChild('header')}" />从bodyContent中取出header子节点.
甚至我们可以对tagBody进行加工之后再进行编译.