- 浏览: 117104 次
- 性别:
- 来自: 哈尔滨
最新评论
-
1054442516:
大哥,小弟刚入门一个月。请tapestry如何集成Mybati ...
(C4)Tapestry IoC:Tapestry IoC Decorators -
walkerstar:
我都是这样做的 public void contribute ...
(2)Tapestry5学习小结:中文验证问题 -
hongyuzhe:
我是真的,那么的那么的希望能多贴出一些,代码说出来。既然能翻译 ...
(A18)Tapestry Core :Configuring Tapestry -
changshuangyi:
问个问题呀,我写的时候为什么private UserAuthe ...
(A6)Tapestry Core:Form Input and Validation -
zhenjw:
怪不得我想看5.0的源代码看不了,原来是没有真正的开放出来呢。 ...
(3)Tapestry5学习小结:显示问题
本文翻译出处 http://tapestry.apache.org/tapestry5/tapestry-core/guide/rendering.html
本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf
组件呈现
Tapestry4 方法
呈现是一个递归的过程。每一个组件实现了一个render()方法(从一个Irender接口继承)。组件将对其模板内的对象调用render()方法,包括其他的组件。
Bruce Tate曾说“如果你有眩晕症,不要站在JavaServer Faces堆栈边向下看”这句话同样可以应用在Tapestry4 。一旦你有很深的嵌套,循环组件,堆栈就会变得非常深。
Tapestry5 方法
组件呈现基于状态机和队列而不是尾递归。这打破了呈现在小块中处理,那样可以容易被实现或取代。不用担心,事实上,这只需要写非常少的代码。
呈现阶段
每个组件的呈现被分为许多阶段,如下图:
每个橙色的阶段(SetupRender, BeginRender, BeforeRenderBody, 等)与你类中一个或多个方法上放置的标注相对应。标注指示Tapestry调用你的方法作为那阶段的一部分。
被这些标住标记的方法被称为呈现阶段方法。
你的方法应该返回void或者返回一个boolean值。返回值能够强制阶段被跳过,或者可以被重新访问。在这个图里,实线显示的是正常的处理路径。当你的呈现阶段方法返回false而不是true或者void时,虚线代表的备用流将被触发。
呈现阶段方法可以不带参数,或者带一个MarkupWriter类型的参数。方法可以是你愿意的任何可见度,通常使用包级私有,这样的可见度可以让你不用使组件方法为public API就可以测试你的代码(同一个包)。
这些方法是可选的,默认的行为是关联每一个阶段。
一般,你的代码将用到SetupRender, BeginRender, AfterRender 和CleanupRender阶段,通常是这些阶段中的一个或两个。
下面是一个用来在两个值之间上下循环的组件源码,多次在他的body内呈现,并将当前的index值放入参数内。
- package org.example.app.components;
- import org.apache.tapestry.annotations.Parameter;
- import org.apache.tapestry.annotations.AfterRender;
- import org.apache.tapestry.annotations.SetupRender;
- public class Count
- {
- @Parameter
- private int _start = 1;
- @Parameter(required = true)
- private int _end;
- @Parameter
- private int _value;
- private boolean _increment;
- @SetupRender
- void initializeValue()
- {
- _value = _start;
- _increment = _start < _end;
- }
- @AfterRender
- boolean next()
- {
- if (_increment)
- {
- int newValue = _value + 1;
- if (newValue <= _end)
- {
- _value = newValue;
- return false;
- }
- }
- else
- {
- int newValue = _value - 1;
- if (newValue >= _end)
- {
- _value = newValue;
- return false;
- }
- }
- return true;
- }
- }
从next()方法的flase值将引发Tapestry重新运行BeginRender阶段,并且从那里,重新呈现组件的body(这个组件没有模板)。返回true过渡到CleanupRender阶段。
注意 Tapestry 是如何适应你的方法的,可以通过标注记号,也可以根据叁数; 这里的两个被标注的方法没有执行任何的输出,因此他们不需要一个 MarkupWriter
真正兴奋的是模板和组件的body将常常包含更多的组件!这意味着很多不同的组件将在他们自己的状态机制的不同阶段。
-
SetupRender
这是一个你可以执行任何为你的组件呈现以前设置的地方。这是一个用来读组件参数和用他们设置临时实例变量的好地方。
-
BeginRender
对于组件这个呈现标签应该在开始标签处被呈现(闭合标签应该在AterRender阶段里被呈现)。组件同样能够防止模板或body由于返回flase被呈现。
组件可以有或没有一个模板。如果组件有模板,那么模板包括一个< body >元素,然后BeforeRenderBody阶段将被触发(让组件选择呈现还是不呈现他的body)。
如果组件模有< body >元素在模板里,那么BeforeRenderBody阶段不会被触发。
如果被BeginRender标注的方法,那么当这个阶段的时候没有特殊的输出方法。但是模板(如果存在)或body(如果当前没有模板,但是组件有body)将被呈现。
-
BeforeRenderTemplate
这个阶段是用来允许组件去修饰他的模板(在模板形成标签的周围创建标签)或者允许组件跳过他的模板的。
-
BeforeRenderBody
与组件body(组件充当容器模板的部分)相关的阶段。该BeforeRenderBody阶段是让组件的能够跳过body, 同时还呈现组件模板的其余部分(如果有).
如果没有方法被BeforeRenderBody标注,那么body将被默认呈现。当组件模板的< body >元素被展开时,这会再次发生,或者如果组件没有模板(但组件有body)时自动发生。
-
AfterRenderBody
AfterRenderBody是body被呈现后执行的阶段;这只对组件的body发生。
-
AfterRender
这个阶段经常被用来呈现闭合标签以匹配BeginRender的起始标签。不管怎样,AfterRender阶段可以继续CleanupRender,或回退到BeginRender(就象上面的Count组件例子)。
如果没有方法被AfterRender标注,那么没有特殊的输出发生,然后CleanupRender阶段被触发。
-
CleanupRender
CleanupRender是SetupRender的互补,他允许最后清除发生。
用方法名代替标注
如果你偏爱不用标注在你的方法上,你可通过为你的方法提供特定的名字这么做。需要的方法名是首字母小写的标注名:setupRender(), beginRender(),等。同标注呈现阶段方法一样,Tapestry对于可见度,返回值和参数是灵活的。
使用这个机制,先前的例子可以被重写成:
- package org.example.app.components;
- import org.apache.tapestry.annotations.Parameter;
- public class Count
- {
- @Parameter
- private int _start = 1;
- @Parameter(required = true)
- private int _end;
- @Parameter
- private int _value;
- private boolean _increment;
- void setupRender()
- {
- _value = _start;
- _increment = _start < _end;
- }
- boolean afterRender()
- {
- if (_increment)
- {
- int newValue = _value + 1;
- if (newValue <= _end)
- {
- _value = newValue;
- return false;
- }
- }
- else
- {
- int newValue = _value - 1;
- if (newValue >= _end)
- {
- _value = newValue;
- return false;
- }
- }
- return true;
- }
- }
这样的风格是一种权衡:获利的一面是,代码更简单了简短了,方法名也是如此,在设计上是较为一致的,从一个类到另一个。损失的一面就是名字是固定的,可能在某些情况下,要比标注方法描述的信息要少 (initializevalue()和next()看起来能描述处更多的信息).
你当然可以搭配使用,在某些场合使用特定的命名呈现阶段方法,在其他场合使用标注呈现阶段方法。
呈现组件
无论如何,返回的组件将排在组件被被呈现之前,这个现行的组件继续呈现。
组件呈现甚至可以来自应用的一个完全不同的页面。
组件递归呈现是不允许的。
这个方法允许Tapestry 页面的呈现是高度动态的。
返回组件实例不是祈祷的短路方法,返回boolean值的方法是。因为可能有多个方法可以返回组件(这是不推荐的---错乱很快就会发生)。
方法冲突和排序
可能有多个方法被相同的呈现阶段标注。这包括同一个类中的方法,或者定义在一个类或者从其他类继承的混合方法。
-
组件呈现前混合
混合中执行的顺序不能在当时被定义。
-
父类在子类之前
顺序始终是父类在前。在父类中定义的方法也总是在子类中定义的方法之前被调用。
-
对AfterXXX和CleanupRender倒序
AfterXXX阶段是BeginXXX 和BeforeXXX 的配对补充。通常元素在一个较早的阶段开始然后元素被闭合在AfterXXX阶段(在body和组件模板间呈现)。
In order to ensure that operations occur in the correct, and natural order, the render phase methods for these two stages are invoked in reverse order:
为了确保操作正确有序的方生,对于这两个时期的呈现阶段方法被倒序调用
1. 子类方法
2. 父类方法
3. 混合子类方法
4. 混合父类方法
-
在一个单一类内
目前,方法是按字母排序。有相同名字的方法通过参数数量排序. 但即使这样,这也不是一个好主意... 只定义一个方法,并且用它以你希望的顺序通知其他方法.
-
短路
如果一个方法返回ture或false值,这将作短路处理。其他在这个阶段通常将被调用的方法将不被调用。
大多数呈现阶段方法将会返回void,以避免对同一阶段的其他方法短路。
评论
2 楼
chinajavawolf
2007-05-21
Struts与WebWork都有着广泛的群众基础和广泛的技术资料,这是他们仍然存在的根基,Tapestry4与Tapestry5的资料太少了,所以导致群众基础也少,希望我微薄的努力,能够为Tapestry5的发展贡献一份力量。
1 楼
rasonyang
2007-05-21
非常感谢!
我用Webwork 2用了3年多,最近看了看Tapestry 5,
有的心动了。
我感觉Struts2/WebWork2对于Command模式的MVC框架来说,已经是相当完美了。当然不能比非java的ROR.
但是这种开发模式,重用、组件开发很麻烦。我尝试过自定义Webwork2的gird标签,很麻烦。后来还是采用extremetable了。我感觉采用T5会更简单一些。
当然,T5也有一个很大的问题,无法使用各种开源的标签。比如extremtable,displayTag等等。但是我想对于一个公司的核心框架来说,这些都不会问题,你完全可以自己开发。
我用Webwork 2用了3年多,最近看了看Tapestry 5,
有的心动了。
我感觉Struts2/WebWork2对于Command模式的MVC框架来说,已经是相当完美了。当然不能比非java的ROR.
但是这种开发模式,重用、组件开发很麻烦。我尝试过自定义Webwork2的gird标签,很麻烦。后来还是采用extremetable了。我感觉采用T5会更简单一些。
当然,T5也有一个很大的问题,无法使用各种开源的标签。比如extremtable,displayTag等等。但是我想对于一个公司的核心框架来说,这些都不会问题,你完全可以自己开发。
发表评论
-
(3)Tapestry5学习小结:显示问题
2007-06-27 11:34 5394显示问题 我在做验证的 ... -
(2)Tapestry5学习小结:中文验证问题
2007-06-27 10:54 4437Tapestry5学习小结:中文验证问题 Tapestry5. ... -
(1)Tapestry5学习小结:中文问题
2007-06-27 10:29 5617(1) Tapestry中文问题 在目前的Tapestr ... -
(F1)Tapestry Upload:Tapestry Upload Component
2007-06-23 12:41 2922本文翻译出处 http://tapestry.apac ... -
(E1)Tapestry-Test
2007-05-28 16:06 3179本文翻译出处 http://tapestry.apache ... -
(D1)Tapestry-Spring Integration
2007-05-28 15:17 3835本文翻译出处 http://tapestry.apache ... -
(C15)Tapestry IoC:Service Builders Shadow Services
2007-05-28 13:45 2613本文翻译出处 http://tap ... -
(C14)Tapestry IoC:Service Builders Building Pipelines
2007-05-28 12:45 2482本文翻译出处 http://tapestry.apache. ... -
(C13)Tapestry IoC:Service Builders Strategy Pattern
2007-05-28 11:30 2245本文翻译出处 http://tap ... -
(C12)Tapestry IoC:Service Builders Chain of Command
2007-05-28 10:10 2267本文翻译出处 http://tap ... -
(C11)Tapestry IoC:Ordering by Constraints
2007-05-27 15:27 2028本文翻译出处 http://tap ... -
(C10)Tapestry IoC:Object Providers
2007-05-27 14:38 2216本文翻译出处 http://tapestry.apache ... -
(C9)Tapestry IoC:Starting the Registry
2007-05-27 11:44 1947本文翻译出处 http://tap ... -
(C8)Tapestry IoC:Symbols
2007-05-27 10:48 2008本文翻译出处 http://tapestry.apache ... -
(C7)Tapestry IoC:Case Insensitivity
2007-05-26 17:02 1642本文翻译出处 http://tapestry.apache ... -
(C6)Tapestry IoC:Type Coercion
2007-05-26 14:29 1752本文翻译出处 http://tap ... -
(C5)Tapestry IoC:Tapestry IoC Configurations
2007-05-26 09:19 1751本文翻译出处 http://tapestry.apache ... -
(C4)Tapestry IoC:Tapestry IoC Decorators
2007-05-25 10:19 1845本文翻译出处 http://tapestry.apache ... -
(C3)Tapestry IoC:Tapestry IoC Services
2007-05-24 13:04 1874本文翻译出处 http://tapestry.apache ... -
(C2)Tapestry IoC:Tapestry IoC Modules
2007-05-22 12:47 2056本文翻译出处 http://tapestry.apache ...
相关推荐
### Tapestry 5:构建 Web 应用程序 #### 一、Tapestry 5 概述 Tapestry 5 是一个强大的 Java Web 开发框架,它为开发者提供了高效且简洁的方式去创建复杂的 Web 应用程序。本书《Tapestry 5:构建 Web 应用程序》...
Tapestry是一项基于组件的web展现层技术,这里将它划分成业务工程HelloTapestry及Component工程源码两项.实际项目中,Component可以成为不同项目中抽离出来的通用的模块,与具体的业务脱离。
- **实现方式**: 通过`<tapestry:link>`标签或`<tapestry:component>`中的`href`属性来实现页面间的跳转。 - **应用场景**: 用户操作后导航到新的页面。 **1.3 初始化** - **初始化方法**: `init()`方法是在组件...
<tapestry:propertySelection name="country" label="Country" model="${countries}" /> ``` **14. Table组件:** - **用途:**用于创建表格。 - **示例代码:** ```xml <tapestry:table data-model="${users}...
1. **Tapestry Core**: 这是Tapestry框架的基础部分,包含了核心组件、服务容器(Tapestry IoC)和页面生命周期管理。通过源码分析,我们可以理解其如何实现页面组件的渲染、事件处理和依赖注入。 2. **Tapestry ...
"tapestry学习入门资料" Tapestry 是一个开源的基于 servlet 的应用程序框架,它使用组件对象模型来创建动态的、交互的 web 应用。 Tapestry 使得 Java 代码与 HTML 完全分离,利用这个框架开发大型应用变得...
这个压缩包包含了多个以"Tapestry"开头的子文件,如 "tapestry-core", "tapestry-hibernate", "tapestry-ioc", "tapestry-upload", 和 "tapestry-spring",这些都是Tapestry框架的不同模块或插件。这些文件的后缀是...
2. **Tapestry Core**:`tapestry-core-5.3.8.jar`是Tapestry框架的核心库,包含了框架的基础组件、服务和API。它提供了页面、组件、事件处理、URL映射等功能,是构建Tapestry应用的基础。 3. **Plastic**:`...
挂毯React 将React( )与Tapestry( )一起使用。 该库提供了将Tapestry与JSX模板结合... define ( [ 't5/core/dom' , 'react' , 'react-dom' ] , function ( dom , React , ReactDOM ) { var HelloMessage = React
- **tapestry-core**:Tapestry的核心库,包含了框架的主要功能和API。 - **tapestry-test**:测试支持模块,提供了针对Tapestry应用的单元测试和集成测试工具。 - **tapestry-spring**:Tapestry与Spring框架的...
《Tapestry 5:构建Web应用程序》是关于Tapestry 5框架的一本权威指南。Tapestry 5是一个强大的Java Web应用框架,由Apache软件基金会开发并维护,它致力于提供一种更高效、更优雅的方式来构建动态、交互式的Web应用...
### Tapestry5:构建Web应用程序 #### 一、Tapestry5概述 Tapestry5是一种先进的、基于Java的Web开发框架,它以其强大的功能、灵活性以及易用性著称。该框架由Howard Lewis Ship创建,并由Apache软件基金会维护。...
Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它强调了组件化、模块化和可重用性,使得开发复杂的Web应用变得更加简单。本文将深入介绍Tapestry 4的相关知识点。 1. **组件化编程**: ...
Tapestry是一个分布式系统基础设施,专门设计用于实现容错性的广域定位和路由。这个系统由Ben Y. Zhao、John Kubiatowicz和Anthony D. Joseph等人在加州大学伯克利分校的计算机科学部开发,旨在应对无处不在计算的...
8. **tapestry-hibernate-NOTICE.txt, tapestry-hibernate-core-NOTICE.txt, tapestry-ioc-NOTICE.txt**:与对应的LICENSE文件类似,这些NOTICE文件列出了在Tapestry的这些特定模块中使用到的第三方组件和它们的版权...
资源名称:深入浅出Tapestry内容简介:本书以循序渐进的方式,从Tapestry框架技术的基本概念入手,讲解Tapestry框架在J2EE Web应用程序中的整体架构实现。使读者在学习如何使用Tapestry框架技术的同时,还能够获得在...
Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它提供了一种基于组件的模型来构建动态、数据驱动的Web应用。本教程将帮助初学者了解Tapestry的基本概念,带你逐步入门并掌握其核心组件的使用...
基于库 特征: 无需编写一行 Javascript 即可创建推送应用程序 完全可配置 使用设置传入消息的... xmlns : p = " tapestry:parameter " > <!-- type a chat message in this form --> < form t :
首先创建一个简单的页面类,继承自`tapestry-ioc:Component`,并定义一个名为`index`的页面。然后创建对应的HTML模板文件,声明页面组件和属性。 #### 3.3 运行应用 通过Maven的`jetty:run`目标启动内置的Jetty...