`

Tapestry 5 组件类

阅读更多
Tapestry 5 组件类
本文档根据 http://tapestry.apache.org/tapestry5/tapestry-core/guide/component-classes.html翻译整理过来,请高手指正,转载请注明出处!
 
Tapestry 5的组件类要比Tapestry 4简单些,它们没有要继承的基类、是具体而非抽象的且没有XML文件,不过还是存在少量的以Java annotations形式的配置,但现在那些都直接声明在类的属性上,优于声明在抽象的getterssettes方法上(Tapestry 4中)。
 
页面、组件和组件混入类都以同种方式创建。
组件类基础
Tapestry 5中创建页面和组件轻而易举!
 
不同于Tapestry 4Tapestry 5中组件类不再是抽象的且不继承框架的基类。它们是纯粹的POJOsPlain Old Java Objects)。
 
仅具有少量约束:
§           类必须声明是公共的(public)。
§           类必须放在正确的包下,按照application configuration
§           类必须具有一个标准公的无参构造器。
 
以下是一个非常基础的组件:
 
java 代码
  1. package org.example.myapp.components;   
  2.     
  3. import org.apache.tapestry.MarkupWriter;   
  4. import org.apache.tapestry.annotations.BeginRender;   
  5.     
  6. public class HelloWorld   
  7. {   
  8.     @BeginRender  
  9.     void renderMessage(MarkupWriter writer)   
  10.     {   
  11.         writer.write("Bonjour from HelloWorld component.");   
  12.     }   
  13. }   
这个组件仅用来输出一个固定的信息。BeginRender annotation是一个组件生命周期annotation,用来告诉Tapestry什么时候在什么情况下调用你类中的方法。
 
还有一点与Tapestry 4不同的是,方法不再需要声明为公共的public),可以具有你想要的任何可见性。
 
组件包
组件类必须存放在一个相应的包中(运行时代码转换和类重载的需要)。
这些包存放在应用根目录${root}包下。
 
页面类放置在${root}.pages下,页面名匹配于这个包下的类名。
 
组件类放置在${root}.components下,组件类型(组件模板中标签属性t:type的引用)匹配于这个包下的类名。
 
混入(mixins)类放置在${root}.mixins下,Mixin类型匹配于这个包下的类名。
 
另外,整个应用存在基类很常见,通常是一些抽象的基类,不需要直接被引用。这些不应直接放在pagescomponentsmixins包下,因为它们这时看起来是有效的pagescomponentsmixins,我们用${root}.base包来存放这些基类。
 
子文件夹/子包
 
类不必直接放入${root}包下(pagescomponentsmixins等等),可以创建子包来存放一些类。子包名将成为页面名或组件类型的一部分。因此你可以定义页面组件com.example.myapp.pages.admin.CreateUser,与此同时页面逻辑名(显示在URL上的)将会是admin/CreateUser
 
页面与组件
 
Tapestry 5中,页面与组件的区别已经非常小了。实际上仅有的不同就是包名:${root}.pages.PageName用于页面,${root}. components.ComponentType用于组件。
 
Tapestry 4中,页面与组件的区别很大,暴露出分隔的接口以及用于编码继承的抽象实现体系。
 
Tapestry 5中,页面仍用于表现,但它已真正成为Tapestry的内部(internal)类。页面组件仅仅是页面组件树的根组件。
 
类转换
 
Tapestry 以使用你的类做为出发点,在运行时对类进行转换,其原因就包括Tapestry如何在多个请求中缓存(pools)页面。
For the most part, these transformations are both sensible and invisible. In a few limited cases, they are maginally leaky -- for instance, the requirement that instance variables be private -- but we feel that the programming model in general will support very high levels of developer productivity.
类转换多半是合理的且不可见的,少数受限的情况下,它们的被忽略无关紧要——比如,一个实例需要是私有的——但是我们会发现设计模式通常会支持一个更高的开发效率。
 
因为转换发生在运行时,所以转换时并不会影响你实际中创建的Tapestry应用。此外,测试时你的类完全是简单的POJOs
 
类重载
Component classes are monitored for changes by the framework. Classes are reloaded when changed. This allows you to build your application with a speed approaching that of a scripting environment, without sacrificing any of the power of the Java platform.
框架监视着组件类的改动,类改变时会被重载。Classes are reloaded when changed.这允许你在不需要牺牲任何Java平台能力的情况下,构建应用的速度接近于脚本环境。
 
实例变量
 
Tapestry组件可以包含实例变量(不同于Tapestry 4,你得使用抽象属性)。
 
实例变量必须是私有的Tapestry将会执行运行时类的修改来支持实例变量,而且仅对私有变量有效。类中可以有非私有的变量,由于Tapestry池化和重新使用页面与组件,你这时会看到应用中的意外行为。对含有非静态且非私有的属性变量,Tapestry将输出一个错误日志。
 
注意你需要提供gettersettter方法访问你类的实例变量。Tapestry不会自动做这事。
 
瞬态实例变量
 
除非你的实例变量被annotation装饰,否则它就是瞬态的实例变量。这意味着它们的值在每一个请求结束时(当页面从请求中分离时)被重置为默认的值。
 
假如你的变量能够在多个请求中保持它的值,你就需要在变量上使用Retain annotation来打破这一重置的规则。你需要注意的是没有客户相关的数据存入在这个属性变量里,因为后面的请求,相同页面实例可能被不同用户所使用。与此同时,相同用户后来的发出请求,也可能是不同的页面实例被使用。
 
使用持久化属性变量(persistent fields)在多个请求中保持信息。
 
此外,final属性变量不会被重置。
构造器
Tapestry将会使用默认的无参构造器来实例化你的类。其它构造器将被忽略。
注入
依赖注入(Injection)通过附加的annotations发生在属性级别。在运行时阶段,属性包含的注入将变为只读性的。
参数
组件参数(Component parameters)也使用私有的类属性来表示,要在属性上加上Parameter annotation
持久化属性
属性可以被加上annotation以便它们在跨请求中保持值。
内嵌的组件
组件通常包含其他组件,组件内置在其他组件里时就叫做内嵌的组件。包含内嵌组件的组件,其模板将包含<comp></comp>元素来识别内嵌组件放置在何处。
 
我们可以在模板中定义组件的类型,或者使用Component annotation定义组件类型与参数来创建组件实例变量,对于后者你不能提供<comp></comp>元素的类型属性,在模板中只提供id属性就行(假如你提供类型属性的话,Tapestry将会使用使用被annotation声明的属性的类型并输出一个错误日志)。
Example:
java 代码
  1. package org.example.app.pages;   
  2.     
  3. import org.apache.tapestry.annotations.Component;   
  4. import org.example.app.components.Count;   
  5.     
  6. public class Countdown   
  7. {   
  8.     @Component(parameters =   
  9.     { "start=5""end=1""value=countValue" })   
  10.     private Count _count;    
  11.     
  12.     private int _countValue;   
  13.     
  14.     public int getCountValue()   
  15.     {   
  16.         return _countValue;   
  17.     }   
  18.     
  19.     public void setCountValue(int countValue)   
  20.     {   
  21.         _countValue = countValue;   
  22.     }   
  23. }    
 
以上定义的内嵌组件id"count"(此id源自属性的名字)。组件的类型是org.example.app.components.CountCount组件的参数startend绑定了字面值(literal values),value参数绑定了Countdown组件的countValue属性。
 
需要注意的是组件类里默认的绑定前缀是"prop:",以上实例中我们可以写成"value=prop:countValue"来完整的显示绑定。
 
然而,某些字面值,比如上例中的数字字面值被接受为prop:前缀,即使他们并不是真正的属性(这给应用开发者带来了极大的方便)。我们也可以使用"literal:"前缀,"start=literal:5"可以完成同样的事情。
 
我们可以在组件模板中指定其他的参数,但是组件类里的参数优先。
TODO: May want a more complex check; what if user uses prop: in the template and there's a conflict?
我们可以利用Component annotationid属性覆盖默认的组件id(即属性名)。
 
如果在组件类中定义一个组件,而模板中没有相应的<comp></comp>元素,Tapestry会输出一个错误日志。
分享到:
评论
5 楼 clant 2007-04-01  
 
4 楼 engineer 2007-03-27  
支持
3 楼 sun58224 2007-03-13  
2 楼 Linuxboy 2007-03-13  
Good!
1 楼 jamesby 2007-03-13  
论坛上研究Tapestry的人好像不多!

相关推荐

    tapestry5 自定义组件

    1. **组件类**:在创建自定义组件时,你需要继承 `tapestry5.Component` 类或者其子类,如 `tapestry5.Block` 或 `tapestry5.MarkupWriter`。在这个例子中,我们可能会创建一个名为 `MyEmail` 的类,它包含发送邮件...

    tapestry4.02中封装ext的GridPanel组件

    在`GridPanel.java`中,会定义Tapestry组件的Java类,包括属性、方法和事件处理逻辑。 3. **配置模板**:编写对应的HTML/TML模板文件,如`GridPanel.tml`,在这个模板中,可以通过Tapestry的标记语言来创建...

    Tapestry的组件及功能

    介绍Tapestry组件的使用和功能。内容还行,使用初学者入门。

    Tapestry5最新中文入门实例教程

    - **组件驱动的开发模型**:Tapestry 5采用组件化的开发方式,每个页面或页面的一部分都可以作为一个独立的组件进行开发,这极大地提高了代码的复用性和维护性。 - **内置的Ajax支持**:Tapestry 5内置了对Ajax的...

    tapestry5中文文档

    Apache Tapestry 5 是一个基于Java的Web应用开发框架,其设计目的是为了简化Web应用程序的构建,提供组件化的页面构建、输入验证、本地化、状态管理和URL映射等功能。Tapestry 5 强调易用性,不仅对终端用户友好,...

    Tapestry 5 Building Web Applications.pdf

    - **Tapestry 5 框架的核心理念**:理解 Tapestry 5 如何通过组件化设计实现代码重用和模块化。 - **组件模型**:深入探讨 Tapestry 5 中的组件模型,包括如何定义和使用组件。 - **页面生命周期**:了解 Tapestry 5...

    Tapestry5最新中文教程

    此外,Tapestry 5 提供了类重加载功能,使得开发过程中的代码改动能够即时生效,无需频繁的部署和重启,显著提升了开发效率。其异常报告机制详尽且具有指导性,帮助开发者快速定位和解决问题。 在Tapestry 5 中,...

    Tapestry 5 電子書

    Tapestry 5是一个开源的Java框架,它提供了组件化和模版驱动的开发方式,使得Web应用的构建更为简洁、直观。这个框架的核心设计理念是将UI逻辑与业务逻辑分离,以提高代码的可读性和可维护性。Tapestry 5在前一版本...

    tapestry页面编辑组件

    在本篇文章中,我们将深入探讨Tapestry的页面编辑组件,以及如何利用这些组件创建交互式的用户界面,包括文本框、单选框、多选框和下拉框。 首先,让我们理解什么是Tapestry页面编辑组件。在Tapestry中,组件是可...

    Tapestry 5开发指南(英文)

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

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

    - **处理表单提交**:定义一个方法来处理表单提交的数据,通常是在组件类中实现。 - **实现验证逻辑**:利用Tapestry的内置验证机制来验证用户输入。 #### 5. 创建“Hi/Lo”游戏 文档中的“Hi/Lo”游戏是一个很好...

    tapestry组件

    tapestry部分组件绑定参数的列表!

    Tapestry5开发文档手册.doc

    Apache Tapestry 5 是一个基于Java的Web应用开发框架,其核心理念是组件化开发,通过构建组件来创建页面。Tapestry 5 提供了一系列的功能,包括输入验证、本地化/国际化、状态管理和URL映射,使得开发者能更高效地...

    Tapestry简单入门.rar_java Tapestry_tapestry

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

    Tapestry5开发文档.doc

    6. **类重加载**:Tapestry5的类重加载特性极大地提升了开发效率,开发者在修改代码后,无需重启服务器即可查看变更效果,这在快速迭代的开发环境中尤其有价值。 7. **Ajax支持**:Tapestry5内置了Ajax功能,使得...

    Tapestry5.chm

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

    Tapestry5使用文档

    **自定义组件** 是 Tapestry5 强大的地方之一,下面列举了一些常用的自定义组件: 1. **上传组件 Upload**:支持同步上传。 2. **ajax 上传图片组件 Uploads**:支持异步上传,提高了交互性。 3. **二级省市级联...

    Tapestry 5 Project 5.0.16 API

    1. **组件模型**:Tapestry 5的核心是组件,它们是可复用的代码单元,可以组合成复杂的Web界面。每个组件都有自己的生命周期,包括初始化、渲染和服务请求等阶段。组件可以通过HTML模板和Java类来定义。 2. **事件...

Global site tag (gtag.js) - Google Analytics