`
chinajavawolf
  • 浏览: 117092 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

(A2)Tapestry Core:Component Classes

阅读更多
 

本文翻译出处 http://tapestry.apache.org/tapestry5/tapestry-core/guide/component-classes.html本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。

chinajavawolf

组件类 <o:p></o:p>

Tapestry5中的组件类比Tapestry4中的轻松容易很多。不在需要继承基类。类就是具体的类(没有抽象)也没有XML文件。仍然有一点是以Java标注形式进行配置的,但那些标注现在直接声明在你的类属性上要优于放在抽象的getterssetters方法上(这是Tapestry4的方案)。.<o:p></o:p>

对于页面、组件和混合类都是使用同一种方法创建的。<o:p></o:p>

组件类基础<o:p></o:p>

Tapestry5中创建页面和组件类是很容易的。<o:p></o:p>

Tapestry4不同,在Tapestry5中组件类不再是抽象的,也不用继承框架的基础类。他们都是单纯的POJOs对象。<o:p></o:p>

只有一些约束:<o:p></o:p>

类必须是公有的。<o:p></o:p>

类必须在正确的包中,按照application configuration.<o:p></o:p>

类必须有一个标准的公用的无参的构造器。<o:p></o:p>

以下是一个非常基础的组件:<o:p></o:p>

  1. package org.example.myapp.components;   
  2.   
  3.     
  4.   
  5. import org.apache.tapestry.MarkupWriter;   
  6.   
  7. import org.apache.tapestry.annotations.BeginRender;   
  8.   
  9.     
  10.   
  11. public class HelloWorld   
  12.   
  13. {   
  14.   
  15.     @BeginRender  
  16.   
  17.     void renderMessage(MarkupWriter writer)   
  18.   
  19.     {   
  20.   
  21.         writer.write("Bonjour from HelloWorld component.");   
  22.   
  23.     }   
  24.   
  25. }   
  26.   

这个组件只有一个工作用来输出一个固定的信息。

另一个和Tapestry4不同的是,这些方法不是必须为公有的。他们可以是你愿意的任何可见度方法。<o:p></o:p>

组件包<o:p></o:p>

组件类必须存在于适当的包内(这是对于运行时代码转换和类加载操作必须的)。<o:p></o:p>

这些包存在于应用程序的根包下。<o:p></o:p>

对于page页面,类应该放在root.pages下。页面的名字被映射到在这个包内的类名。<o:p></o:p>

对于components组件,类应该放在root.components下。组件类型被映射到在这个包内的类名。<o:p></o:p>

对于混合组件,类应该放在root.mixins.混合类型被映射到在这个包内的类名。<o:p></o:p>

另外。对于应用程序要用到的共同的基础类,通常是抽象基础类,他们不被直接引用。这些应该不放在pages,components 或者mixins包内。因为他们随后会被有效的页面、组件和混合所替换。使用root.base包存放这些基础的类。<o:p></o:p>

子文件夹/子包<o:p></o:p>

类不是必须直接放在包里(pages,components,mixins等)。可以正确的创建一个子包用来存储这些类。这个子包名成为页面或者组件类型的一部分。这样你可以定义一个页面组件 com.example.myapp.pages.admin.CreateUser ,这个逻辑页面名(显示在URLs上的)就会是admin/CreateUser.<o:p></o:p>

Tapestry 执行一些简化的最佳的逻辑页面名(或者是组件类型或者是混合类型) 。他检查看如果包名是一个前缀或者后缀不合格的类名就删除前缀或者后缀。最终的结果是一个类名像这样 com.example.myapp.pages.user.EditUser 将有一个user/Edit(不是user/EditUser)的页面名.这样的目的是为了提供一个简单自然的URLs.<o:p></o:p>

页面 vs. 组件<o:p></o:p>

Tapestry5中二者的区别是非常非常小的。他们仅有的区别是包名。root.pages.PageName用于页面。root.components.ComponentType用于组件.<o:p></o:p>

Tapestry4中,页面和组件有着很大差别。 表现在当你的类从隔离接口和抽象层次继承的时候。<o:p></o:p>

Tapestry5中,页面仍旧用于表现。但已是真正的Tapestry内部类。页面组件仅是页面组件树的根组件。<o:p></o:p>

类的转换<o:p></o:p>

Tapestry 使用你的类作为一个起点。他在运行时转换你的类。这是必要的,原因就包括Tapestry如何处理在请求间缓存页面。<o:p></o:p>

在大多数情况下,这些转变都是合理而无形的.

在几个有限的情况下,他们被遗漏例如,需要一个被私有的实例变量但是我们感觉设计模式在通常都将支持非常高水平的开发效率。<o:p></o:p>

因为转换不会出现在运行时之前,事实上在你创建一个Tapestry程序,并且在构建程序阶段是不受影响的。此外,你的类在测试时是绝对简单的POJOs对象。<o:p></o:p>

动态类重载<o:p></o:p>

组件类的改变是被框架监听的。当类改变的时候将被重载。这允许你在不需要牺牲任何Java平台性能的情况下,构建应用的速度接近于脚本环境。<o:p></o:p>

他是如此的快速。你都注意不到类魔术般的重载已经发生了。<o:p></o:p>

最终的结果:卓越的生产能力---改变你的类,立刻就能够看到变化。<o:p></o:p>

可是,类的重载只被应用在组件类上。其他的类,例如服务接口和实现,或者其他数据对象被普通的类加载器加载不被动态类重载。<o:p></o:p>

实例变量<o:p></o:p>

Tapestry 组件可以有实例变量(不像Tapestry 4,你不得不使用抽象属性)<o:p></o:p>

实例变量必须是私有的。Tapestry必须执行运行时类的修改来支持实例变量,并且只对私有变量。在你的类中可以有非私有的变量,但是这样你就会在你的程序中看到不可预料的异常行为,这是因为Tapestry对页面和组件的缓冲和重用。对含有非静态并且非私有的属性变量,Tapestry将输出一个错误日志。<o:p></o:p>

要知道的是你需要提供gettersetter方法以访问你类的实例变量。Tapestry不会自己做的。<o:p></o:p>

瞬时的实例变量<o:p></o:p>

除非一个实例变量被标注修饰,否则他将成为一个瞬时变量。这意味着当请求范围结束后他的值将被设回默认值(当页面被丛请求中分离时)。<o:p></o:p>

如果你希望保留你的变量值在多个请求之间已打破重置逻辑,那么你应该在你的属性上增加一个Retain标注。你需要注意的是没有客户细节的数据被存在这个属性变量里,因为后面的请求,相同页面实例可能被不同用户使用。同样,相同用户后来的请求,也可能是不同的页面实例被使用。<o:p></o:p>

使用持久属性在一个请求到另一个请求间保留信息.<o:p></o:p>

此外,final属性是最终的。是不会被重置的。<o:p></o:p>

构造器<o:p></o:p>

Tapestry 将会使用默认的无参构造器来实例化你的类。其他的构造器将被忽略。<o:p></o:p>

注入<o:p></o:p>

依赖注入通过附加的标注发生在属性级别。在运行时,属性包含的注入会变成只读的。<o:p></o:p>

参数<o:p></o:p>

在你的类中组件参数也被定义为使用私有属性,使用参数标注。<o:p></o:p>

持久化属性<o:p></o:p>

属性被标注以便他们在请求间保留他们的值。<o:p></o:p>

内嵌组件<o:p></o:p>

组件经常包含其他组件。在其他组件的模板内部的组件被称为内嵌组件。这个包含内嵌组件的模板将包含Tapestry命名空间的专有元素,确定那个内嵌组件的位置。<o:p></o:p>

你可以在模板中定义组件类型,或者你可以使用组件标注去定义组件类型和参数为组件产生一个实例变量。<o:p></o:p>

例如<o:p></o:p>

  1. package org.example.app.pages;   
  2.   
  3. import org.apache.tapestry.annotations.Component;   
  4.   
  5. import org.example.app.components.Count;   
  6.   
  7. public class Countdown   
  8.   
  9. {   
  10.   
  11.     @Component(parameters =   
  12.   
  13.     { "start=5""end=1""value=countValue" })   
  14.   
  15.     private Count _count;     
  16.   
  17.      
  18.   
  19.     private int _countValue;   
  20.   
  21.     
  22.   
  23.     public int getCountValue()   
  24.   
  25.     {   
  26.   
  27.         return _countValue;   
  28.   
  29.     }   
  30.   
  31.     
  32.   
  33.     public void setCountValue(int countValue)   
  34.   
  35.     {   
  36.   
  37.         _countValue = countValue;   
  38.   
  39.     }   
  40.   
  41. }     
  42.   

以上定义组件的内嵌组件

注意在组件类里默认的绑定前缀是"prop:",在上面的例子中我们可以写成"value=prop:countValue"来完整的显示绑定。<o:p> </o:p>

然而,某些字面值,比如上例中的数字字面值被接受绑定prop:前缀,即使他们并不是真正的属性(这给程序开发者带来了极大的方便)。我们也可以使用"literal:"前缀,"start=literal:5"可以完成同样的事情。我们可以在组件模板中指定其他的参数,但是组件类里的参数优先

分享到:
评论
1 楼 deaboway 2007-08-09  
这篇好多了,至少不像是机器翻译的了
thx

相关推荐

    Tapestry.5.Building.Web.Applications.pdf

    ### Tapestry 5:构建 Web 应用程序 #### 一、Tapestry 5 概述 Tapestry 5 是一个强大的 Java Web 开发框架,它为开发者提供了高效且简洁的方式去创建复杂的 Web 应用程序。本书《Tapestry 5:构建 Web 应用程序》...

    Tapestry5.1-Component工程源码

    Tapestry是一项基于组件的web展现层技术,这里将它划分成业务工程HelloTapestry及Component工程源码两项.实际项目中,Component可以成为不同项目中抽离出来的通用的模块,与具体的业务脱离。

    Tapestry字典0.1.pdf

    - **实现方式**: 通过`&lt;tapestry:link&gt;`标签或`&lt;tapestry:component&gt;`中的`href`属性来实现页面间的跳转。 - **应用场景**: 用户操作后导航到新的页面。 **1.3 初始化** - **初始化方法**: `init()`方法是在组件...

    Tapestry开发

    &lt;tapestry:propertySelection name="country" label="Country" model="${countries}" /&gt; ``` **14. Table组件:** - **用途:**用于创建表格。 - **示例代码:** ```xml &lt;tapestry:table data-model="${users}...

    tapestry源码 api等

    1. **Tapestry Core**: 这是Tapestry框架的基础部分,包含了核心组件、服务容器(Tapestry IoC)和页面生命周期管理。通过源码分析,我们可以理解其如何实现页面组件的渲染、事件处理和依赖注入。 2. **Tapestry ...

    tapestry学习入门资料

    "tapestry学习入门资料" Tapestry 是一个开源的基于 servlet 的应用程序框架,它使用组件对象模型来创建动态的、交互的 web 应用。 Tapestry 使得 Java 代码与 HTML 完全分离,利用这个框架开发大型应用变得...

    apache-tapestry-5.3.8-bin.zip

    2. **Tapestry Core**:`tapestry-core-5.3.8.jar`是Tapestry框架的核心库,包含了框架的基础组件、服务和API。它提供了页面、组件、事件处理、URL映射等功能,是构建Tapestry应用的基础。 3. **Plastic**:`...

    优化大使tapestry-bin-5.0.18.zip

    这个压缩包包含了多个以"Tapestry"开头的子文件,如 "tapestry-core", "tapestry-hibernate", "tapestry-ioc", "tapestry-upload", 和 "tapestry-spring",这些都是Tapestry框架的不同模块或插件。这些文件的后缀是...

    tapestry-react:Apache Tapestry和React的集成

    挂毯React 将React( )与Tapestry( )一起使用。 该库提供了将Tapestry与JSX模板结合... define ( [ 't5/core/dom' , 'react' , 'react-dom' ] , function ( dom , React , ReactDOM ) { var HelloMessage = React

    tapestry官方中文文档

    Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它强调了组件化、模块化和可重用性,使得开发复杂的Web应用变得更加简单。本文将深入介绍Tapestry 4的相关知识点。 1. **组件化编程**: ...

    Tapestry5.0.7

    - **tapestry-core**:Tapestry的核心库,包含了框架的主要功能和API。 - **tapestry-test**:测试支持模块,提供了针对Tapestry应用的单元测试和集成测试工具。 - **tapestry-spring**:Tapestry与Spring框架的...

    tapestry-bin-5.1.0.5

    8. **tapestry-hibernate-NOTICE.txt, tapestry-hibernate-core-NOTICE.txt, tapestry-ioc-NOTICE.txt**:与对应的LICENSE文件类似,这些NOTICE文件列出了在Tapestry的这些特定模块中使用到的第三方组件和它们的版权...

    Tapestry简单入门.rar_java Tapestry_tapestry

    Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它提供了一种基于组件的模型来构建动态、数据驱动的Web应用。本教程将帮助初学者了解Tapestry的基本概念,带你逐步入门并掌握其核心组件的使用...

    tapestry5 build web application-alexander

    《Tapestry 5:构建Web应用程序》是关于Tapestry 5框架的一本权威指南。Tapestry 5是一个强大的Java Web应用框架,由Apache软件基金会开发并维护,它致力于提供一种更高效、更优雅的方式来构建动态、交互式的Web应用...

    深入浅出Tapestry

    资源名称:深入浅出Tapestry内容简介:本书以循序渐进的方式,从Tapestry框架技术的基本概念入手,讲解Tapestry框架在J2EE Web应用程序中的整体架构实现。使读者在学习如何使用Tapestry框架技术的同时,还能够获得在...

    Tapestry4开发指南

    《Tapestry4开发指南》是由干煸四季豆编写的,旨在帮助开发者深入理解并熟练运用Tapestry4这一框架进行应用开发。Tapestry4是一个基于Java的Web应用程序框架,它强调组件化、模版驱动和声明式编程,极大地提高了开发...

    Tapestry5, Packt.Publishing.Tapestry.5.Building.Web.Applications.Jan.2008.RETAiL.eBOOk-sUppLeX.pdf

    ### Tapestry5:构建Web应用程序 #### 一、Tapestry5概述 Tapestry5是一种先进的、基于Java的Web开发框架,它以其强大的功能、灵活性以及易用性著称。该框架由Howard Lewis Ship创建,并由Apache软件基金会维护。...

    (Tapestry)An infrastructure for Fault-Tolerant Wide-area Location and Routing.ppt

    Tapestry是一个分布式系统基础设施,专门设计用于实现容错性的广域定位和路由。这个系统由Ben Y. Zhao、John Kubiatowicz和Anthony D. Joseph等人在加州大学伯克利分校的计算机科学部开发,旨在应对无处不在计算的...

    Tapestry 5.1 实例教程

    首先创建一个简单的页面类,继承自`tapestry-ioc:Component`,并定义一个名为`index`的页面。然后创建对应的HTML模板文件,声明页面组件和属性。 #### 3.3 运行应用 通过Maven的`jetty:run`目标启动内置的Jetty...

Global site tag (gtag.js) - Google Analytics