在Tapestry中,声明调组件有两种方式:
第一种称为隐式调用组件,即直接在html模板中声明组件调用,如:
<input type="text" jwcid="@TextField" value="ognl:username"/>
第二种称为显式调用组件,即只在html模板的jwcid属性中声明组件ID,然后在页面规范中配置组件,如:
<!-- 页面模板 声明组件ID-->
<input type="text" jwcid="username"/>
<!-- 页面规范 配置组件-->
<component id="username" type="TextField">
<binding name="value" value="username"/>
</component>
这两种方式是等同的,它们的差别在于html模板的嵌入程度不同。
当Tapestry启动之后,会扫描html模板,如果jwcid标签属性的值带有“@”符合,则表示隐式调用组件;如果不带有“@”符号,则表示显式调用组件。Tapestry会根据jwcid属性声明的组件ID在页面规范中寻找与之相匹配的组件配置。
在页面规范中定义页面属性就相当于在页面类中定义成员变量。我们可以形象地理解,在Tapestry框架实际运作的时候,它会自动为你的页面类生成一个subclass子类,并根据页面规范中页面属性的定义,自动为其添加标准的JavaBean属性。当然,这只是一种形象的理解,因为Tapestry是通过扫描XML文件并应用反射来实现整个过程,并不会真的去生成一个subclass子类。