技术开发 频道

Tapestry 5 组件模板

IT168技术文档】

    Tapestry中,组件模板是与页面或组件类相关的文件,包含组件以及其内嵌组件的标记(markup)。

    从Tapestry 4中变化而来,在Tapestry 5中,组件模板是格式良好的XML文档。这意味着每一个起始标签必须有一个相匹配的结束标签,每一个属性都要被引用起来等等。

    模板多半是标准的(X)HTML;Tapestry以提供Tapestry命名空间的形式扩展了普通的标记(markup)。

    我们将简短介绍模板的具体内容,首先详细介绍组件与模板是如何联系的。

    模板定位

    组件模板与组件类文件存放在一起,文件后缀名为".html",与相应组件类存放在同一包下。

    在典型的Maven目录结构中,组件的Java类可以是src/main/java/org/example/myapp/components/MyComponent.java。相应的模板将会是src/main/resources/org/example/myapp/components/MyComponent.html。

    与此同时,页面的Java类可以是src/main/java/org/example/myapp/pages/MyPage.java。相应的模板将会是src/main/resources/org/example/myapp/pages/MyPage.html。

    模板与被编译的类将会被一起打包到WAR应用包的WEB-INF/classes文件夹下。

    对于页面(非组件),还有一个位置将会被查找:web应用目录下(web application context),位置是基于页面的逻辑名,在先前的一个例子中,模板应该是在web应用根目录下的MyPage.html。

    类路径下的模板要优先于web应用目录下的模板文件。

    模板国际化

    模板像单独的组件信息分类文件一样被国际化(localized)了:文件名后接有效的local(如en,zh_CN)。因此德国的用户将看到由MyPage_de.html生成的页面内容,法国的用户将看到由MyPage_fr.html生成的页面内容,当没有明确的国际化文件时,默认的国际化文件(MyPage.html)会被使用。

    模板继承

    如果一个组件没有模板,但是它继承的父组件类有模板,此时父类的模板将会被用作子模板。

    这就允许组件继承基类的模板而不是重复基类的模板。

    Tapestry命名空间

    组件模板应该包括Tapestry命名空间,其定义在模板的根元素中。

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> <head> <title>Hello World Page</title> </head> <body> <h1>Hello World</h1> </body> </html>

    这里的命名空间定义使用了标准的前缀“t:”,这一页中的实例都采用这一标准前缀。

    Tapestry元素

    Tapestry元素都采用Tapestry命名空间前缀定义的元素。其他元素应该在默认的命名空间中,没有前缀。 

<body>

    在许多情况下,组件被设计成与其模板中内嵌的模板整合在一起。<body>元素被用来标识组件模板中的内嵌模板的body被呈现(rendered)在哪里。

    组件可以控制(经常)其body是否被呈现。

    以下实例是一个Layout组件,页面具体内容里面添加了基本的HTML元素。

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> <head> <title>My Tapestry Application</title> </head> <body> <t:body/> </body> </html>

    以下是页面应该如何使用这一组件:

<t:layout xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> My Page Specific Content </t:layout>

    当页面呈现时,页面模板和其外围的组件模板被合并到了一起: 

<html> <head> <title>My Tapestry Application</title> </head> <body> My Page Specific Content </body> </html>

    Tapestry 4用户将意识到<body>元素就是RenderBody 组件的替代。 

<block>

    block是组件部分模板的容器。block不会正常呈现(render),任何组件或内容放入一个block都不会被正常呈现。然而,通过注入block,你可以精确控制什么时候及是否呈现内容。

    block可以是匿名的,或者拥有一个id(通过id属性来指定)。非匿名block可以注入(injected)到组件里。

<parameter>

    参数元素是一个特殊类型的block,它被放置在一个内嵌组件的body中。 block通过<parameter>定义传入到组件。<parameter>包含一个必须的name属性用以识别绑定了组件的哪一个参数。
Example:

<t:if test="loggedIn"> Hello, ${userName}! <t:parameter name="else"> Click <a t:type="actionlink" t:id="login">here</a> to log in. </t:parameter> </t:if>
0
相关文章