论坛首页 Java企业应用论坛

Tapestry 5组件事件

浏览 8807 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-04-01  
Tapestry 5组件事件
 
本文根据http://tapestry.apache.org/tapestry5/tapestry-core/guide/event.html翻译整理过来,请高手指正,转载请注明出处!
 
本人随后时间将忙于单点登录研究,翻译Tapestry 5的时间不多,稍后章节翻译将会较慢,还望各位继续支持!
 
组件事件
 
组件事件是指组件所察觉到的用户的行为,如点击链接或提交表单。
 
组件主要用于两种用途:
  • 它们呈现了用户在客户端浏览器中触发链接或表单发起的请求。这些在页面导航(page navigation请求处理(requst processing)中有更全面的描述。
  • 它们描绘了一个请求中的控制流即允许一个组件通知它的容器一些情境(一个表单被提交),或者从容器中收集一些片断数据。
通常,一个导航请求(由用户发起)将产生许多控制流请求。如,表单组件被将一个动作请求触发,然后发送通知事件声称表单提交事件将被处理,随后不管成功与否。
 
Tapestry 4中,你可以用一个方法名来配置组件的一个参数,当某一特定事件发生时(通常来自客户端的请求)该方法将被调用。如:
  1. <form jwcid=”@Form” listener=”listener:someMethodName”>  
这有一些局限性,包括事实上仅有一个方法被调用。
 
Tapestry 5引入了通过命名约定或者OnEvent annotation来标识的事件处理方法(event handler methods)。事件处理方法可以有任何的可见性,甚至私有的(通常它们是包可见性的,用以支持测试)。
 
同比于配置组件一个被调用的特定的方法,你可以标识一个或多个方法来监听组件事件。单独的一个事件处理方法可以接收许多不同组件的通知事件,如在事件处理方法上加上@OnEvent(component={"component1", "component2"})
 
比如,这里是一个让用户选择110数字的页面片断(就叫"chooser"):
  1. <p> Choose a number from 1 to 10: </p>  
  2.   
  3. <p>  
  4.     <t:count end="10" value="index">  
  5.         <a t:id="select" t:type="actionlink" context="index">${index}</t:comp>  
  6.     </t:count>  
  7. </p>  
 
ActionLink组件创建一个动作URL
 
URL标识了页面包含的组件("chooser"),事件的类型(除非不是默认且很通常的"action"事件类型),页面里组件的id"select")还有附加的上下文(context)值。
 
 
当存在附加的上下文值时,它们被追加到路径中。
 
这里示范了Tapestry与传统方式URL的关键区别,它是一个面向动作的框架。这里的URL并不是说链接被点击时发生了什么,而是标识哪个组件来响应。
 
没有从URL到一段代码的简单映射;这里通过调用事件处理方法的形式来替代组件发送通知事件。
 
当组件生成的链接被用户点击时,一个Java方法将会被调用。
  1. @OnEvent(component = "select")   
  2.  void valueChosen(int value)   
  3.  {   
  4.     _value = value;   
  5.  }   
 
Tapestry在此做了两件事:
  • 确认valueChosen()方法作为调用的方法。
  • 将上下文值从字符串转换为整数并传送给事件处理方法。
在上面的实例中,valueChosen()方法将在choose组件产生任何事件时被调用(至少有一个上下文值)。因为ActionLink组件仅产生单个事件类型,即"action",这不会带来任何问题(OnEvent可以配置事件类型)。
 
某些组件能产生多种事件,些时你需要更多的细节参数:
 
 
  1. @OnEvent(value = "action", component = "select")   
  2.  void valueChosen(int value)   
  3.  {   
  4.     _value = value;   
  5. }   
 
 
OnEvent annotationvalue属性用来匹配事件名。
"action"是默认的事件类型名,ActionLink Form组件都使用这个事件类型。如果你省略了OnEvent annotationcomponent参数,它就是收到所有包含组件的通知事件,可能包括内嵌组件(因为事件冒泡机制event bubbling)。
你可以限定接收哪个或哪些组件的事件。
 
事件处理方法命名约定
 
作为使用annotations的一种替代,我们可以以指定的方式命名事件,Tapestry将会调用你的方法,就好像方法被声明了annotation一样。
 
这种事件处理方法的命名方式以前缀"on"开头,紧跟着动作的名字(首字母大写capitalized),然后加上"From" 一个首字母大写的组件id
先前的例子可以写成:
 
  1. void onActionFromSelect(int value)   
  2. {   
  3.    _value = value;
  4. }   
 
如果事件类型命名为"onAny",它将接受所有事件类型,我们很少需要此种方式!
如果出于某些难解的原因我们需要以同一方法接收不同组件的相同事件,我们就需要OnEvent annotation
 
来自Howard的提示:我发现我更喜欢命名约定方式,保留annotation只是为了其他不适合的情况。
 
事件上下文(Event Context
 
上下文值(ActionLink组件的context参数)可以是任何对象,然而,仅发生一个简单的字符串转换。与Tapestry 4相比,他有一个精细的类型机制,怪名叫"DataSqueezer"
 
此外,不管是什么值(string, number, date),它都会被转换为文本字符串。这将形成一个更可读的URL
 
如果带有多个上下文值(通过将一个对象list或数组绑定到ActionLinkcontext参数),则每一个值都将有序地追加到URL中。
 
当一个事件处理方法被调用时,将发生一个强制(coercion)从字符串到实际类型的转换。事件处理方法仅当上下文值的数量至少与方法参数数量一致时被调用,带有过多参数的方法将被跳过。
 
另外,一个事件处理方法还可以带上一个java.lang.Object[]类型的参数。这个参数会接收整个上下文数组。这在上下文不同时间为不同长度时有用处。我们可以使用一个个显式的参数或者单个的Object[]类型的参数。
 
事件冒泡(Event Bubbling
 
事件会冒泡向上传递到层级,直到它被终止。事件在事件处理方法返回一个非null值时终止。
对于页面导航事件,事件处理方法的返回决定了Tapestry将如何呈现响应。
 
   发表时间:2007-04-01  
辛苦了!
0 请登录后投票
   发表时间: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
全部翻译要好长时间噢。
建议楼主一篇文章多翻译几个部分。
0 请登录后投票
   发表时间:2007-04-01  
我只翻译基础核心部分, 主要是CORE包的大部分,其他部分视情况而定,而且目前CORE包里留下的章节内容并不多了....

THANKS!
0 请登录后投票
   发表时间:2007-04-02  
建议在满江红建立翻译项目,1为更多人参与,2为可以结集出版
0 请登录后投票
   发表时间:2007-04-03  
是个好想法....稍后联系满江红......
0 请登录后投票
   发表时间:2007-04-17  
tapestry 好像只支持 jdk1.5了,起码所有的文档都是针对jdk1.5编写的?
0 请登录后投票
   发表时间:2007-07-11  
要是有一本全的就好了
0 请登录后投票
   发表时间:2007-07-11  
楼上的可以去http://www.iteye.com/subject/Tapestry5专栏看chinajavawolf翻译的...他应该已将官方文档全翻译了!

我原本是想大部分翻译的, 不过chinajavawolf很快就翻译了其他章节, 看他翻译了...我也就停工了....^_^
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics