Tapestry 5 组件模板
扩展表达式(Expansions)
另外一种呈现输出就是使用扩展表达式。扩展表达式是可以内嵌在模板体内的特殊字符串,借用了Ant构建工具的一些语法。
Welcome, ${userId}!
在此,${userId}是一个扩展表达式。此例中,组件的属性userId被提取出来转换成一个字符串流向输出。
扩展表达式只能用在普通的模板文本中;不允许用在属性中或者CDATA段中。
从其特性来讲,扩展表达式和参数绑定(parameter bindings)一样,它的默认绑定前缀为"prop:"(表示一个属性名),还有其他的绑定前缀也很有用,特别是"message:"(用来访问组件分类信息中的国际化信息)。
Tapestry 4用户会注意到扩展表达式很简洁,它轻松替代了Insert组件或者<span key="...">标识。
组件元素
一个内嵌的组件在模板中被识别为t:命名空间下的元素。如:
内嵌组件可以有两个Tapestry相关的参数:
§ id:组件的唯一id(在其容器中)。
§ mixins:用于组件的一个可选的用逗号分隔的混入组件(mixins)的列表。
这些属性指定在t:命名空间里(如,t:id="clear")。
如果id属性被忽略,Tapestry会给这个元素赋一个唯一id。
其他属性用于绑定组件的参数(bind parameters of the component),这些可能是正式参数或非正式参数。正式参数会有一个默认的绑定前缀(通常是"prop:"),非正式参数假定为字面的(如,"literal:"绑定前缀)。
对于其他所有属性,t:前缀是可选的。一些用户实现一个用于Tapestry模板文件校验的构建程序…此时,任何Tapestry相关的属性,非底层DTD或scheme定义的属性,应该在Tapestry的命名空间里,避免产生校验错误。
Tapestry组件元素的开始和结束标签定义了组件的body,这常见于一些组件封入到另外的组件body里。
我们有可能将Tapestry组件放置在子包(subclasses?)里。比如,应用中有一个包org.example.myapp.components.ajax.Dialog。这个组件正常的类型名是"ajax/dialog"(因为它在ajax子文件夹下),这个名字是有问题的,因为它不能通过元素名<t:ajax/dialog>有效地定义XML元素。此时,我们使用句点替换斜线——<t:ajax.dialog>。
隐式标识(invisibleInstrumentation )
Tapestry中一个突出的特性是隐式标识(invisible instrumentation),用来标记普通的HTML元素为组件。隐式标识可以让模板更加简洁及更好的可读性。
Tapestry 5中,我们使用命名空间id或类型属性来标记一个任意的元素为组件,如下:
Placing an attribute in the Tapestry namespace is useful when the attribute is not defined for the element being instrumented. 当被标识的元素属性未被定义时,将这个属性放入Tapestry的命名空间里是有用的。
只指定t:id属性而不在模板或类中提供明确的类型也是有效的。些种情况,Tapestry会使用Any组件,它有点像是任何其他组件的一种替代。
在大多数情况下,在普通内嵌组件和隐式标识组件之间选择是一个美学问题。少数情况下,如Loop组件,其行为决定于你的选择。当Loop组件使用隐式标识的方式时,将会在其body外围呈现标签及任何非正式参数。因此,比如:
另外一种呈现输出就是使用扩展表达式。扩展表达式是可以内嵌在模板体内的特殊字符串,借用了Ant构建工具的一些语法。
Welcome, ${userId}!
在此,${userId}是一个扩展表达式。此例中,组件的属性userId被提取出来转换成一个字符串流向输出。
扩展表达式只能用在普通的模板文本中;不允许用在属性中或者CDATA段中。
从其特性来讲,扩展表达式和参数绑定(parameter bindings)一样,它的默认绑定前缀为"prop:"(表示一个属性名),还有其他的绑定前缀也很有用,特别是"message:"(用来访问组件分类信息中的国际化信息)。
Tapestry 4用户会注意到扩展表达式很简洁,它轻松替代了Insert组件或者<span key="...">标识。
组件元素
一个内嵌的组件在模板中被识别为t:命名空间下的元素。如:
元素名"actionlink"用于标识组件的类型——"ActionLink"(Tapesty在识别组件类型时不区分大小写)。You have $...{cartItems.size()} items in your cart.
<t:actionlink t:id="clear">Remove All</t:actionlink>.
内嵌组件可以有两个Tapestry相关的参数:
§ id:组件的唯一id(在其容器中)。
§ mixins:用于组件的一个可选的用逗号分隔的混入组件(mixins)的列表。
这些属性指定在t:命名空间里(如,t:id="clear")。
如果id属性被忽略,Tapestry会给这个元素赋一个唯一id。
其他属性用于绑定组件的参数(bind parameters of the component),这些可能是正式参数或非正式参数。正式参数会有一个默认的绑定前缀(通常是"prop:"),非正式参数假定为字面的(如,"literal:"绑定前缀)。
对于其他所有属性,t:前缀是可选的。一些用户实现一个用于Tapestry模板文件校验的构建程序…此时,任何Tapestry相关的属性,非底层DTD或scheme定义的属性,应该在Tapestry的命名空间里,避免产生校验错误。
Tapestry组件元素的开始和结束标签定义了组件的body,这常见于一些组件封入到另外的组件body里。
在一些情况下,组件需要某种闭合标签;比如,以上所有字段域组件如果没有被Form组件所封闭将会抛出一个运行时异常。<t:form>
<t:errors/>
<t:label for="userId"/>
<t:textfield t:id="userId"/>
<br/>
<t:table for="password"/>
<t:passwordfield t:id="password"/>
<br/>
<input type="submit" value="Login"/>
</t:form>
我们有可能将Tapestry组件放置在子包(subclasses?)里。比如,应用中有一个包org.example.myapp.components.ajax.Dialog。这个组件正常的类型名是"ajax/dialog"(因为它在ajax子文件夹下),这个名字是有问题的,因为它不能通过元素名<t:ajax/dialog>有效地定义XML元素。此时,我们使用句点替换斜线——<t:ajax.dialog>。
隐式标识(invisibleInstrumentation )
Tapestry中一个突出的特性是隐式标识(invisible instrumentation),用来标记普通的HTML元素为组件。隐式标识可以让模板更加简洁及更好的可读性。
Tapestry 5中,我们使用命名空间id或类型属性来标记一个任意的元素为组件,如下:
id、type和mixins属性必须放在Tapestry的命名空间里。任何其他的属性可以在Tapestry命名空间里或默认的命名空间里。<p>
Merry Christmas:
<span t:type="Count" end="3">
Ho!
</span>
</p>
Placing an attribute in the Tapestry namespace is useful when the attribute is not defined for the element being instrumented. 当被标识的元素属性未被定义时,将这个属性放入Tapestry的命名空间里是有用的。
只指定t:id属性而不在模板或类中提供明确的类型也是有效的。些种情况,Tapestry会使用Any组件,它有点像是任何其他组件的一种替代。
在大多数情况下,在普通内嵌组件和隐式标识组件之间选择是一个美学问题。少数情况下,如Loop组件,其行为决定于你的选择。当Loop组件使用隐式标识的方式时,将会在其body外围呈现标签及任何非正式参数。因此,比如:
这里,loop组件并入<tr>元素里,它将对每一个列表项呈现一个<tr>,以及在<tr>中输出一个动态的class属性。<table>
<tr t:type="loop" source="items" value="item" class="prop:rowClass">
<td>${item.id}</td>
<td>${item.name}</td>
<td>${item.quantity}</td>
</tr>
</tabel>
0
相关文章
