`

Tapestry 5 组件模板

阅读更多
Tapestry 5 组件模板
 
 
本文根据http://tapestry.apache.org/tapestry5/tapestry-core/guide/templates.html翻译整理过来,请高手指正,转载请注明出处!
 
 
Tapestry中,组件模板是与页面或组件类相关的文件,包含组件以及其内嵌组件的标记(markup)。
 
Tapestry 4中变化而来,在Tapestry 5中,组件模板是格式良好的XML文档。这意味着每一个起始标签必须有一个相匹配的结束标签,每一个属性都要被引用起来等等。
 
模板多半是标准的(XHTMLTapestry以提供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(如enzh_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>
 
扩展表达式(Expansions
 
另外一种呈现输出就是使用扩展表达式。扩展表达式是可以内嵌在模板体内的特殊字符串,借用了Ant构建工具的一些语法。
 
Welcome, ${userId}!
 
在此,${userId}是一个扩展表达式。此例中,组件的属性userId被提取出来转换成一个字符串流向输出。
 
扩展表达式只能用在普通的模板文本中;不允许用在属性中或者CDATA段中。
 
从其特性来讲,扩展表达式和参数绑定(parameter bindings)一样,它的默认绑定前缀为"prop:"(表示一个属性名),还有其他的绑定前缀也很有用,特别是"message:"(用来访问组件分类信息中的国际化信息)。
 
Tapestry 4用户会注意到扩展表达式很简洁,它轻松替代了Insert组件或者<span key="...">标识。
 
组件元素
 
一个内嵌的组件在模板中被识别为t:命名空间下的元素。如:
 
 You have ${cartItems.size()} items in your cart.
 <t:actionlink t:id="clear">Remove All</t:actionlink>.
 
元素名"actionlink"用于标识组件的类型——"ActionLink"Tapesty在识别组件类型时不区分大小写)。
 
内嵌组件可以有两个Tapestry相关的参数:
§                 id:组件的唯一id(在其容器中)。
§     mixins:用于组件的一个可选的用逗号分隔的混入组件(mixins)的列表。
 
这些属性指定在t:命名空间里(如,t:id="clear")。
 
如果id属性被忽略,Tapestry会给这个元素赋一个唯一id
 
其他属性用于绑定组件的参数bind parameters of the component),这些可能是正式参数或非正式参数。正式参数会有一个默认的绑定前缀(通常"prop:"),非正式参数假定为字面的(如,"literal:"绑定前缀)。
 
对于其他所有属性,t:前缀是可选的。一些用户实现一个用于Tapestry模板文件校验的构建程序此时,任何Tapestry相关的属性,非底层DTDscheme定义的属性,应该在Tapestry的命名空间里,避免产生校验错误。
 
Tapestry组件元素的开始和结束标签定义了组件的body,这常见于一些组件封入到另外的组件body里。
 
<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>
 
在一些情况下,组件需要某种闭合标签;比如,以上所有字段域组件如果没有被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或类型属性来标记一个任意的元素为组件,如下:
<p>
    Merry Christmas:
    <span t:type="Count" end="3">
        Ho!
    </span>
</p>
 
idtypemixins属性必须放在Tapestry的命名空间里。任何其他的属性可以在Tapestry命名空间里或默认的命名空间里。
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外围呈现标签及任何非正式参数。因此,比如:
 
 <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>
 
这里,loop组件并入<tr>元素里,它将对每一个列表项呈现一个<tr>,以及在<tr>中输出一个动态的class属性。
 
分享到:
评论
3 楼 netmil 2007-06-13  
2 楼 tapestry土豆 2007-03-26  
支持 多多总结
1 楼 sun58224 2007-03-15  

相关推荐

    tapestry5 自定义组件

    总结起来,创建一个自定义的邮件组件在 Tapestry 5 中涉及编写组件类、模板文件和元数据配置,并将其集成到应用中。这个过程需要对 Tapestry 5 的组件模型有深入理解,包括生命周期、事件处理、依赖注入等概念。通过...

    tapestry4.02中封装ext的GridPanel组件

    2. **定义Tapestry组件**:创建一个Tapestry组件(例如,名为`GridPanel`),这个组件负责与ExtJS的GridPanel交互。在`GridPanel.java`中,会定义Tapestry组件的Java类,包括属性、方法和事件处理逻辑。 3. **配置...

    tapestry页面编辑组件

    Tapestry是一个强大的Java web应用程序框架,由Apache软件基金会维护。...在实际开发过程中,结合Tapestry的其他特性,如组件服务、国际化支持、模板语言等,你将能构建出更高级、更灵活的应用系统。

    Tapestry 5开发指南(英文)

    - **组件模型**:Tapestry 5的基础是组件,它们是可重用的、自包含的UI元素。组件可以是HTML元素、表单字段,甚至其他更复杂的组件。 - **页面和组件生命周期**:理解页面和组件的创建、初始化、渲染和销毁过程是...

    tapestry 5 ..........

    ### 关于Tapestry 5的关键知识点 #### 1. 什么是Tapestry? Tapestry是一个开源框架,用于创建动态、稳健且高度可扩展的Java Web应用程序。它补充并建立在标准Java Servlet API之上,因此可以在任何Servlet容器或...

    Tapestry5.chm

    Tapestry 5是一个开源的、组件驱动的MVC框架,它强调了代码的可读性和可维护性,为开发人员提供了丰富的功能和灵活性。 Tapestry 5的核心概念是组件,这些组件可以是简单的HTML元素,也可以是复杂的业务逻辑封装。...

    Tapestry简单入门.rar_java Tapestry_tapestry

    接下来,我们转向"tapestry组件.docx",组件是Tapestry的核心组成部分,它们是可重用的、自包含的代码单元,可以处理用户交互、展示数据或执行业务逻辑。组件可以是简单的HTML元素,也可以是复杂的UI部件。组件的...

    Tapestry5开发文档.doc

    1. **组件基础**:Tapestry5的核心是组件,它允许开发者将UI分解为独立的、可重用的部分。每个组件都由Java类和HTML模板组成,这使得页面设计与业务逻辑分离,提高了代码的可维护性。 2. **输入验证**:框架内置了...

    Tapestry 5 Project 5.0.16 API

    6. **模板语言**:Tapestry 5使用一种基于HTML的模板语言,允许在HTML中嵌入组件和事件处理。这种语言既保留了HTML的语义,又提供了与Java的紧密集成。 7. **国际化和本地化**:Tapestry 5支持多语言环境,通过资源...

    Tapestry5BuildingWebApplications

    - **组件化模型**:Tapestry5采用了组件化的开发模式,将复杂的用户界面分解成可复用的组件。每个组件都是一个独立的功能单元,可以独立于其他组件被创建、修改和重用。 - **灵活的数据绑定**:Tapestry5支持强大的...

    tapestry5.2.6 jar包

    5. **持久层集成**:Tapestry与Hibernate等ORM框架无缝集成,简化了数据库操作,如tapestry-hibernate模块,它提供了对Hibernate的支持。 6. **Spring集成**:通过tapestry-spring模块,Tapestry可以与Spring框架...

    tapestry官方中文文档

    使用Tapestry,开发者可以创建HTML模板,并在其中嵌入Tapestry表达式来引用组件或数据。Tapestry还提供了强大的国际化支持,使得应用能够适应不同语言环境。 7. **性能优化**: Tapestry通过缓存和页面部分更新等...

    tapestry4和5学习资料

    可能包括了模板语言、组件库、服务注入、AOP(面向切面编程)特性、国际化和本地化支持、错误与异常处理等方面的详细介绍。 3. **tapestry开发流程.docx**: 这份文档详细介绍了使用Tapestry进行开发的步骤和流程...

    tapestry3开发指南,带tapestry3所有jar包

    **Tapestry 3 开发指南** Tapestry 3 是一个开源的Java Web应用程序框架,它在20世纪90年代...虽然现在更现代的版本如Tapestry 5和Tapestry 6已经发布,但Tapestry 3仍然是理解Web开发历史和技术演进的一个重要参考。

    Tapestry

    Tapestry是一个基于Java的全栈Web应用程序框架,它的设计目的是为了简化Web应用开发,提供组件化和高度交互性的页面。Tapestry并不是一个应用服务器,而是一个可以在应用服务器中运行的框架,用于构建动态、复杂的...

    tapestry-project-4.1.5

    通过研究这个项目,我们可以看到Tapestry 的目录结构,如`src/main/java`存放Java 代码,`src/main/webapp`包含Web 应用资源,如HTML、CSS、JavaScript 文件以及Tapestry 的组件模板。此外,`WEB-INF`目录下的`web....

    Tapestry 5.1 实例教程(全部)

    5. **模版语言**:Tapestry使用一种基于HTML的模板语言,它允许在HTML中直接插入Java代码。理解模板元素、属性、条件语句和循环结构。 6. **Ajax支持**:Tapestry提供了内置的Ajax支持,使你能够创建富客户端界面。...

    Tapestry.5.Building.Web.Applications.pdf

    此外,还讲解了如何利用模板语言(Template Language)来定义组件的HTML结构。 对于业务逻辑的处理,Tapestry 5.0引入了服务组件模型。这一模型使得服务可以被注入到其他组件中,实现松耦合。文档会阐述如何定义...

Global site tag (gtag.js) - Google Analytics