浏览 8807 次
锁定老帖子 主题:Tapestry 5组件事件
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-01
Tapestry 5组件事件
本人随后时间将忙于单点登录研究,翻译Tapestry 5的时间不多,稍后章节翻译将会较慢,还望各位继续支持!
组件事件
组件事件是指组件所察觉到的用户的行为,如点击链接或提交表单。
组件主要用于两种用途:
通常,一个导航请求(由用户发起)将产生许多控制流请求。如,表单组件被将一个动作请求触发,然后发送通知事件声称表单提交事件将被处理,随后不管成功与否。
Tapestry 4中,你可以用一个方法名来配置组件的一个参数,当某一特定事件发生时(通常来自客户端的请求)该方法将被调用。如:
Tapestry 5引入了通过命名约定或者OnEvent annotation来标识的事件处理方法(event handler methods)。事件处理方法可以有任何的可见性,甚至私有的(通常它们是包可见性的,用以支持测试)。
同比于配置组件一个被调用的特定的方法,你可以标识一个或多个方法来监听组件事件。单独的一个事件处理方法可以接收许多不同组件的通知事件,如在事件处理方法上加上@OnEvent(component={"component1", "component2"})。
比如,这里是一个让用户选择1到10数字的页面片断(就叫"chooser"):
ActionLink组件创建一个动作URL。
URL标识了页面包含的组件("chooser"),事件的类型(除非不是默认且很通常的"action"事件类型),页面里组件的id("select")还有附加的上下文(context)值。
当存在附加的上下文值时,它们被追加到路径中。
这里示范了Tapestry与传统方式URL的关键区别,它是一个面向动作的框架。这里的URL并不是说链接被点击时发生了什么,而是标识哪个组件来响应。
没有从URL到一段代码的简单映射;这里通过调用事件处理方法的形式来替代组件发送通知事件。
当组件生成的链接被用户点击时,一个Java方法将会被调用。
Tapestry在此做了两件事:
在上面的实例中,valueChosen()方法将在choose组件产生任何事件时被调用(至少有一个上下文值)。因为ActionLink组件仅产生单个事件类型,即"action",这不会带来任何问题(OnEvent可以配置事件类型)。
某些组件能产生多种事件,些时你需要更多的细节参数:
OnEvent annotation的value属性用来匹配事件名。
"action"是默认的事件类型名,ActionLink 和 Form组件都使用这个事件类型。如果你省略了OnEvent annotation的component参数,它就是收到所有包含组件的通知事件,可能包括内嵌组件(因为事件冒泡机制event bubbling)。
你可以限定接收哪个或哪些组件的事件。
事件处理方法命名约定
作为使用annotations的一种替代,我们可以以指定的方式命名事件,Tapestry将会调用你的方法,就好像方法被声明了annotation一样。
这种事件处理方法的命名方式以前缀"on"开头,紧跟着动作的名字(首字母大写capitalized),然后加上"From" 和一个首字母大写的组件id。
先前的例子可以写成:
如果事件类型命名为"onAny",它将接受所有事件类型,我们很少需要此种方式!
如果出于某些难解的原因我们需要以同一方法接收不同组件的相同事件,我们就需要OnEvent annotation。
来自Howard的提示:我发现我更喜欢命名约定方式,保留annotation只是为了其他不适合的情况。
事件上下文(Event Context)
上下文值(ActionLink组件的context参数)可以是任何对象,然而,仅发生一个简单的字符串转换。与Tapestry 4相比,他有一个精细的类型机制,怪名叫"DataSqueezer"。
此外,不管是什么值(string, number, date),它都会被转换为文本字符串。这将形成一个更可读的URL。
如果带有多个上下文值(通过将一个对象list或数组绑定到ActionLink的context参数),则每一个值都将有序地追加到URL中。
另外,一个事件处理方法还可以带上一个java.lang.Object[]类型的参数。这个参数会接收整个上下文数组。这在上下文不同时间为不同长度时有用处。我们可以使用一个个显式的参数或者单个的Object[]类型的参数。
事件冒泡(Event Bubbling)
事件会冒泡向上传递到层级,直到它被终止。事件在事件处理方法返回一个非null值时终止。
对于页面导航事件,事件处理方法的返回决定了Tapestry将如何呈现响应。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-01
辛苦了!
![]() |
|
返回顶楼 | |
发表时间:2007-04-01
楼主是不是要全部翻译啊?
如果 Component Classes Component Templates Component Parameters Page Navigation Input Validation Component Events Page Lifecycle Component Mixins Localization Assets Type Coercion Component Rendering Persistent Data Application State Injection Aliases Configuration Request Processing DOM Class Reloading Unit testing pages/components 全部翻译要好长时间噢。 建议楼主一篇文章多翻译几个部分。 |
|
返回顶楼 | |
发表时间:2007-04-01
我只翻译基础核心部分, 主要是CORE包的大部分,其他部分视情况而定,而且目前CORE包里留下的章节内容并不多了....
THANKS! |
|
返回顶楼 | |
发表时间:2007-04-02
建议在满江红建立翻译项目,1为更多人参与,2为可以结集出版
|
|
返回顶楼 | |
发表时间:2007-04-03
是个好想法....稍后联系满江红......
|
|
返回顶楼 | |
发表时间:2007-04-17
tapestry 好像只支持 jdk1.5了,起码所有的文档都是针对jdk1.5编写的?
|
|
返回顶楼 | |
发表时间:2007-07-11
要是有一本全的就好了
|
|
返回顶楼 | |
发表时间:2007-07-11
楼上的可以去http://www.iteye.com/subject/Tapestry5专栏看chinajavawolf翻译的...他应该已将官方文档全翻译了!
我原本是想大部分翻译的, 不过chinajavawolf很快就翻译了其他章节, 看他翻译了...我也就停工了....^_^ |
|
返回顶楼 | |